Android
Data objects
Types de Données Parse: Guide Android pour Développeurs
24 min
analyser les types de données sur android introduction dans ce guide, vous apprendrez à propos des types de données parse en utilisant android vous lirez et enregistrerez les objets parse sur back4app depuis une application android le stockage des données sur parse est construit autour du parseobject parseobject chaque parseobject parseobject contient des paires clé valeur de données compatibles json ces données sont sans schéma, ce qui signifie que nous n'avons pas besoin de spécifier à l'avance quelles clés existent sur chaque parseobject parseobject nous pouvons définir n'importe quelles paires clé valeur que nous voulons, et notre backend les stockera par exemple, disons que nous suivons les meilleurs scores pour un jeu un seul parseobject parseobject pourrait contenir les clés doivent être des chaînes alphanumériques, et les valeurs peuvent être chaîne chaîne => chaîne chaîne nombre nombre (valeurs numériques primitives telles que int int , double double ) booléen booléen => boolean boolean datetime datetime => java util date null null => jsonobject null tableau tableau =>jsonarray fichier fichier => fichier parse pointeur pointeur => autre parseobject relation relation => parserelation geopoint geopoint => parsegeopoint chaque parseobject parseobject a un nom de classe que nous pouvons utiliser pour distinguer différents types de données par exemple, nous pourrions appeler l'objet de score élevé un gamescore gamescore il y a aussi quelques champs que nous n'avons pas besoin de spécifier qui sont fournis par commodité objectid objectid est un identifiant unique pour chaque objet enregistré createdat createdat et updatedat updatedat représentent le moment où chaque objet a été créé et modifié pour la dernière fois dans le cloud chacun de ces champs est automatiquement rempli par back4app au moment où nous enregistrons un nouveau parseobject parseobject nous vous recommandons de nameyourclasseslikethis nameyourclasseslikethis (uppercamelcase) et nameyourkeyslikethis nameyourkeyslikethis (lowercamelcase), juste pour garder votre code joli ce tutoriel utilise une application de base créée dans android studio 4 1 1 avec buildtoolsversion=30 0 2 buildtoolsversion=30 0 2 , compile sdk version compile sdk version = 30 0 2 30 0 2 et targetsdkversion 30 targetsdkversion 30 à tout moment, vous pouvez accéder au projet complet via nos dépôts github dépôt d'exemple kotlin dépôt d'exemple java objectif notre objectif est de créer une application android qui peut traiter tous les types de données fournis par parse server voici un aperçu de ce que nous allons réaliser conditions préalables pour compléter ce tutoriel, nous avons besoin de android studio une application créée sur back4app remarque suivez le tutoriel de nouvelle application parse pour apprendre à créer une application parse sur back4app une application android connectée à back4app remarque suivez le tutoriel d'installation du sdk parse pour créer un projet android studio connecté à back4app un appareil (ou appareil virtuel ) fonctionnant sous android 4 1 (jelly bean) ou version ultérieure comprendre notre application vous allez créer une application pour une meilleure compréhension de parse types de données types de données dans cette android android application, vous allez créer tous les types de données dans une classe nommée datatypes datatypes et assigner des valeurs aux variables de cette classe ensuite, nous allons lire et mettre à jour ces données remarque les types de données pointeur pointeur , relation relation , fichier fichier , geopoint geopoint seront abordés plus tard dans des guides spécifiques commençons! 1 créer un modèle d'application définissez les variables suivantes dans le mainactivity mainactivity et remplacez le code dans la oncreate oncreate méthode par le code suivant 1 private progressdialog progressdialog; 2 private view popupinputdialogview; 3 private recyclerview recyclerview; 4 private string objectid; 5 private static final string tag = "mainactivity"; 6 7 @override 8 protected void oncreate(bundle savedinstancestate) { 9 super oncreate(savedinstancestate); 10 setcontentview(r layout activity main); 11 12 progressdialog = new progressdialog(mainactivity this); 13 14 button savedata = findviewbyid(r id savedata); 15 button readdata = findviewbyid(r id readdata); 16 button updatedata = findviewbyid(r id updatedata); 17 18 savedata setonclicklistener(savedataview > { 19 try { 20 savedatatypes(); 21 } catch (jsonexception e) { 22 e printstacktrace(); 23 } 24 }); 25 26 readdata setonclicklistener(readdataview > readobjects()); 27 28 updatedata setonclicklistener(updatedataview > updateobject()); 29 30 }1 private var progressdialog progressdialog? = null 2 private var objectid string? = null 3 private var popupinputdialogview view? = null 4 private var recyclerview recyclerview? = null 5 private val tag = "mainactivity" 6 7 override fun oncreate(savedinstancestate bundle?) { 8 super oncreate(savedinstancestate) 9 setcontentview(r layout activity main) 10 11 progressdialog = progressdialog(this\@mainactivity) 12 val savedata = findviewbyid\<button>(r id savedata) 13 val readdata = findviewbyid\<button>(r id readdata) 14 val updatedata = findviewbyid\<button>(r id updatedata) 15 16 savedata setonclicklistener { 17 try { 18 savedatatypes() 19 } catch (e jsonexception) { 20 e printstacktrace() 21 } 22 } 23 readdata setonclicklistener { readobjects() } 24 updatedata setonclicklistener { updateobject() } 25 } avant les prochaines étapes, nous devons connecter back4app back4app à notre application vous devez enregistrer le appid appid et clientkey clientkey de back4app back4app dans le fichier string xml string xml puis init parse parse dans notre fichier app java app java ou app kt app kt suivez le nouveau tutoriel d'application parse si vous ne savez pas comment init parse parse à votre application 2 code pour enregistrer un objet la fonction de création va créer un nouvel objet dans la base de données back4app nous définissons le savedatatypes savedatatypes fonction que nous appelons dans la oncreate oncreate fonction et utilisons le code suivant dans cette fonction nous allons enregistrer tous les types de données avec cette fonction dans l'objet des classes datatypes 1 private void savedatatypes() throws jsonexception{ 2 parseobject parseobject = new parseobject("datatypes"); 3 4 parseobject put("stringfield", "string"); 5 parseobject put("doublefield", 1 5); 6 parseobject put("intfield", 2); 7 parseobject put("boolfield", true); 8 parseobject put("datefield", calendar getinstance() gettime()); 9 10 jsonobject myobject = new jsonobject(); 11 myobject put("number", 1); 12 myobject put("string", "42"); 13 14 parseobject put("jsonobject", myobject); 15 16 17 jsonarray myarray = new jsonarray(); 18 myarray put(myobject); 19 myarray put(myobject); 20 myarray put(myobject); 21 22 parseobject put("jsonarray", myarray); 23 24 25 list\<string> list = new arraylist<>(); 26 list add("string1"); 27 list add("string2"); 28 parseobject put("liststringfield", list); 29 30 list\<integer> listint = new arraylist<>(); 31 listint add(1); 32 listint add(2); 33 listint add(3); 34 parseobject put("listintfield", listint); 35 36 list\<boolean> listbool = new arraylist<>(); 37 listbool add(true); 38 listbool add(false); 39 parseobject put("listboolfield", listbool); 40 41 progressdialog show(); 42 parseobject saveinbackground(e > { 43 progressdialog dismiss(); 44 if (e == null) { 45 toast maketext(this, "object created successfully ", toast length short) show(); 46 objectid = parseobject getobjectid(); 47 } else { 48 objectid = null; 49 toast maketext(this, e getmessage(), toast length long) show(); 50 } 51 }); 52 }1 private fun savedatatypes() { 2 val parseobject = parseobject("datatypes") 3 4 parseobject put("stringfield", "string") 5 parseobject put("doublefield", 1 5) 6 parseobject put("intfield", 2) 7 parseobject put("boolfield", true) 8 parseobject put("datefield", calendar getinstance() time) 9 10 11 val myobject = jsonobject() 12 myobject put("number", 1) 13 myobject put("string", "42") 14 15 parseobject put("jsonobject", myobject) 16 17 val myarray = jsonarray() 18 myarray put(myobject) 19 myarray put(myobject) 20 myarray put(myobject) 21 22 parseobject put("jsonarray", myarray) 23 24 val list mutablelist\<string> = arraylist() 25 list add("string1") 26 list add("string2") 27 parseobject put("liststringfield", list) 28 29 val listint mutablelist\<int> = arraylist() 30 listint add(1) 31 listint add(2) 32 listint add(3) 33 parseobject put("listintfield", listint) 34 35 val listbool mutablelist\<boolean> = arraylist() 36 listbool add(true) 37 listbool add(false) 38 parseobject put("listboolfield", listbool) 39 40 progressdialog? show() 41 parseobject saveinbackground { 42 progressdialog? dismiss() 43 if (it == null) { 44 toast maketext(this, "object created successfully ", toast length short) show() 45 objectid = parseobject objectid 46 } else { 47 objectid = null 48 toast maketext(this, it message, toast length long) show() 49 } 50 } 51 } 3 code pour lire l'objet nous allons donner le objectid objectid variable que nous avons assignée dans le savedatatypes savedatatypes fonction comme paramètre à la requête et lire les données que nous avons sauvegardées dans le savedatatypes savedatatypes fonction avec la readobjects readobjects fonction 1 private void readobjects() { 2 if (objectid == null) { 3 toast maketext(this, "no object click on the 'save data' button before ", toast length short) show(); 4 return; 5 } 6 7 parsequery\<parseobject> query = new parsequery<>("datatypes"); 8 9 progressdialog show(); 10 query getinbackground(objectid, (object, e) > { 11 progressdialog dismiss(); 12 if (e == null) { 13 list\<data> list = new arraylist<>(); 14 list add(new data("int list field",object get("listintfield") tostring())); 15 list add(new data("string field",object get("stringfield") tostring())); 16 list add(new data("double field",object get("doublefield") tostring())); 17 list add(new data("int field",object get("intfield") tostring())); 18 list add(new data("string list field",object get("liststringfield") tostring())); 19 list add(new data("date field",object get("datefield") tostring())); 20 list add(new data("bool field",object get("boolfield") tostring())); 21 list add(new data("list bool field",object get("listboolfield") tostring())); 22 list add(new data("json object field",object get("jsonobject") tostring())); 23 list add(new data("json array field",object get("jsonarray") tostring())); 24 25 showdatatypes(list); 26 27 } else { 28 toast maketext(this, e getmessage(), toast length short) show(); 29 } 30 }); 31 }1 private fun readobjects() { 2 if (objectid == null) { 3 toast maketext( 4 this, 5 "no object click on the 'save data' button before ", 6 toast length short 7 ) show() 8 return 9 } 10 11 val query = parsequery\<parseobject>("datatypes") 12 13 14 progressdialog? show() 15 query getinbackground( 16 objectid 17 ) { obj, e > 18 progressdialog? dismiss() 19 if (e == null) { 20 21 val list mutablelist\<data> = arraylist() 22 list add(data("int list field", obj get("listintfield") tostring())) 23 list add(data("string field",obj get("stringfield") tostring())) 24 list add(data("double field", obj get("doublefield") tostring())) 25 list add(data("int field", obj get("intfield") tostring())) 26 list add(data("string list field", obj get("liststringfield") tostring())) 27 list add(data("date field",obj get("datefield") tostring())) 28 list add(data("bool field", obj get("boolfield") tostring())) 29 list add(data("list bool field", obj get("listboolfield") tostring())) 30 list add(data("json object field", obj get("jsonobject") tostring())) 31 list add(data("json array field", obj get("jsonarray") tostring())) 32 showdatatypes(list) 33 } else { 34 toast maketext(this, e message, toast length short) show() 35 } 36 37 } 38 } dans cette section, nous avons créé une classe modèle appelée données données nous utilisons les données que nous obtenons dans la lireobjets lireobjets fonction pour créer des objets à partir de cette classe modèle nous donnons ces objets comme éléments à la liste que nous avons créée dans données données type ensuite, nous donnons cette liste comme paramètre à la montrertypesdedonnées montrertypesdedonnées fonction et la listons dans le alertdialog alertdialog ceci est le données données modèle 1 public class data { 2 private string type; 3 private string value; 4 5 public data(string type, string value) { 6 this type = type; 7 this value = value; 8 } 9 10 public string gettype() { 11 return type; 12 } 13 14 public data settype(string type) { 15 this type = type; 16 return this; 17 } 18 19 public string getvalue() { 20 return value; 21 } 22 23 public data setvalue(string value) { 24 this value = value; 25 return this; 26 } 27 }1 class data(val type\ string?=null,val value\ string?=null) { 2 3 } ceci est la showdatatypes showdatatypes fonction 1 private void showdatatypes(list\<data> list){ 2 alertdialog builder alertdialogbuilder = new alertdialog builder(mainactivity this); 3 alertdialogbuilder settitle("data types"); 4 alertdialogbuilder setcancelable(true); 5 initpopupviewcontrols(list); 6 //we are setting our custom popup view by alertdialog builder 7 alertdialogbuilder setview(popupinputdialogview); 8 final alertdialog alertdialog = alertdialogbuilder create(); 9 alertdialog show(); 10 } 11 12 private void initpopupviewcontrols(list\<data> list) { 13 layoutinflater layoutinflater = layoutinflater from(mainactivity this); 14 popupinputdialogview = layoutinflater inflate(r layout custom alert dialog, null); 15 recyclerview = popupinputdialogview\ findviewbyid(r id recyclerview); 16 itemadapter adapter = new itemadapter(list,this); 17 recyclerview\ setlayoutmanager(new linearlayoutmanager(this,linearlayoutmanager vertical,false)); 18 recyclerview\ setadapter(adapter); 19 }1 private fun showdatatypes(list list\<data>) { 2 val alertdialogbuilder = alertdialog builder(this\@mainactivity) 3 alertdialogbuilder settitle("data types") 4 alertdialogbuilder setcancelable(true) 5 initpopupviewcontrols(list) 6 //we are setting our custom popup view by alertdialog builder 7 alertdialogbuilder setview(popupinputdialogview) 8 val alertdialog = alertdialogbuilder create() 9 alertdialog show() 10 } 11 12 @suppresslint("inflateparams") 13 private fun initpopupviewcontrols(list list\<data>) { 14 val layoutinflater = layoutinflater from(this\@mainactivity) 15 popupinputdialogview = layoutinflater inflate(r layout custom alert dialog, null) 16 recyclerview = popupinputdialogview? findviewbyid(r id recyclerview) 17 val adapter = itemadapter(this\@mainactivity, list) 18 recyclerview? layoutmanager = linearlayoutmanager( 19 this, 20 linearlayoutmanager vertical, 21 false 22 ) 23 recyclerview? adapter = adapter 24 } 4 code pour mettre à jour l'objet la updateobject updateobject fonction est responsable de la mise à jour des données dans l'objet créé sur le savedatatypes savedatatypes fonction nous utilisons objectid objectid à nouveau pour mettre à jour l'objet 1 public void updateobject() { 2 if (objectid == null) { 3 toast maketext(this, "no object click on the 'save data' button before ", toast length short) show(); 4 return; 5 } 6 7 parseobject parseobject = new parseobject("datatypes"); 8 parseobject setobjectid(objectid); 9 parseobject put("intfield", 5); 10 parseobject put("stringfield", "new string"); 11 12 progressdialog show(); 13 14 parseobject saveinbackground(e > { 15 progressdialog dismiss(); 16 if (e == null) { 17 toast maketext(this, "object updated successfully ", toast length short) show(); 18 } else { 19 toast maketext(this, e getmessage(), toast length short) show(); 20 } 21 }); 22 }1 private fun updateobject() { 2 if (objectid == null) { 3 toast maketext( 4 this, 5 "no object click on the 'save data' button before ", 6 toast length short 7 ) show() 8 return 9 } 10 11 val parseobject = parseobject("datatypes") 12 parseobject objectid = objectid 13 parseobject put("intfield", 5) 14 parseobject put("stringfield", "new string") 15 16 progressdialog? show() 17 18 parseobject saveinbackground { 19 progressdialog? dismiss() 20 if (it == null) { 21 toast maketext(this, "object updated successfully ", toast length short) show() 22 } else { 23 toast maketext(this, it message, toast length short) show() 24 } 25 } 26 } 5 utilisation des compteurs l'exemple ci dessus contient un cas d'utilisation courant le intfield intfield champ peut être un compteur que nous devrons mettre à jour continuellement la solution ci dessus fonctionne, mais elle est encombrante et peut entraîner des problèmes si nous avons plusieurs clients essayant de mettre à jour le même compteur parse fournit des méthodes qui incrémentent de manière atomique tout champ numérique pour aider à stocker des données de type compteur ainsi, la même mise à jour peut être réécrite comme 1 parseobject parseobject = new parseobject("datatypes"); 2 parseobject setobjectid(objectid); 3 parseobject increment("intfield",1);1 val parseobject = parseobject("datatypes") 2 parseobject objectid = objectid 3 parseobject increment("intfield",1) 6 utilisation des listes parse fournit également des méthodes pour aider à stocker des données de liste il existe trois opérations qui peuvent être utilisées pour modifier un champ de liste de manière atomique setadd setadd et setaddall setaddall ajoute les objets donnés à la fin d'un champ de tableau setaddunique setaddunique et setaddallunique setaddallunique ajoute uniquement les objets donnés qui ne sont pas déjà contenus dans un champ de tableau à ce champ la position de l'insertion n'est pas garantie remove remove et removeall removeall supprime toutes les instances des objets donnés d'un champ de tableau 6 1 exemples avec add et addall liststringfield liststringfield a la valeur exécution du code ci dessous 1 parseobject parseobject = new parseobject("datatypes"); 2 parseobject setobjectid(objectid); 3 parseobject add("liststringfield","e"); 4 parseobject addall("liststringfield", arrays aslist("e", "f", "g", "g")); 5 parseobject save();1 val parseobject = parseobject("datatypes") 2 parseobject objectid = objectid 3 parseobject add("liststringfield", "e") 4 parseobject addall("liststringfield", arrays aslist("e", "f", "g", "g")) 5 parseobject save() après cette commande, le résultat du champ stringlist sera 6 2 exemples avec addunique et addallunique liststringfield liststringfield a la valeur exécuter le code ci dessous 1 parseobject parseobject = new parseobject("datatypes"); 2 parseobject setobjectid(objectid); 3 parseobject addunique("liststringfield","e"); 4 parseobject addallunique("liststringfield",arrays aslist("c", "d", "e", "f")); 5 parseobject save();1 val parseobject = parseobject("datatypes") 2 parseobject objectid = objectid 3 parseobject addunique("liststringfield", "e") 4 parseobject addallunique("liststringfield", arrays aslist("c", "d", "e", "f")) 5 parseobject save() après cette commande, le résultat du stringlist stringlist champ sera aucune valeur n'a été répétée 6 3 exemples avec removeall liststringfield liststringfield a la valeur exécuter le code ci dessous 1 parseobject parseobject = new parseobject("datatypes"); 2 parseobject setobjectid(objectid); 3 parseobject removeall("liststringfield",arrays aslist("c", "d", "e", "f")); 4 parseobject save();1 val parseobject = parseobject("datatypes") 2 parseobject objectid = objectid 3 parseobject removeall("liststringfield", arrays aslist("c", "d", "e", "f")) 4 parseobject save() après cette commande, le résultat du stringlist stringlist champ sera note qu'il n'est actuellement pas possible d'ajouter et de supprimer des éléments d'un tableau de manière atomique dans la même sauvegarde nous devrons appeler la sauvegarde pour chaque opération de tableau différente que nous souhaitons effectuer séparément 7 supprimer un champ unique de parseobject vous pouvez supprimer un champ unique d'un objet en utilisant l' remove remove opération 1 parseobject parseobject = new parseobject("datatypes"); 2 parseobject remove("stringfield"); 3 parseobject save();1 val parseobject = parseobject("datatypes") 2 parseobject remove("stringfield") 3 parseobject save() c'est fait ! à ce stade, nous avons appris types de données parse types de données parse sur android android