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 \<font color="#2166ae">parseobject\</font> chaque \<font color="#2166ae">parseobject\</font> 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 \<font color="#2166ae">parseobject\</font> 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 \<font color="#2166ae">parseobject\</font> pourrait contenir 1 score 1337 , nomdujoueur "sean plott" , modetriche false les clés doivent être des chaînes alphanumériques, et les valeurs peuvent être \<font color="#2166ae">chaîne\</font> => \<font color="#2166ae">chaîne\</font> \<font color="#2166ae">nombre\</font> (valeurs numériques primitives telles que \<font color="#2166ae">int\</font> , \<font color="#2166ae">double\</font> ) \<font color="#2166ae">booléen\</font> => \<font color="#2166ae">boolean\</font> \<font color="#2166ae">datetime\</font> => java util date \<font color="#2166ae">null\</font> => jsonobject null \<font color="#2166ae">tableau\</font> =>jsonarray \<font color="#2166ae">fichier\</font> => fichier parse \<font color="#2166ae">pointeur\</font> => autre parseobject \<font color="#2166ae">relation\</font> => parserelation \<font color="#2166ae">geopoint\</font> => parsegeopoint chaque \<font color="#2166ae">parseobject\</font> 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 \<font color="#2166ae">gamescore\</font> il y a aussi quelques champs que nous n'avons pas besoin de spécifier qui sont fournis par commodité \<font color="#2166ae">objectid\</font> est un identifiant unique pour chaque objet enregistré \<font color="#2166ae">createdat\</font> et \<font color="#2166ae">updatedat\</font> 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 \<font color="#2166ae">parseobject\</font> nous vous recommandons de \<font color="#2166ae">nameyourclasseslikethis\</font> (uppercamelcase) et \<font color="#2166ae">nameyourkeyslikethis \</font> (lowercamelcase), juste pour garder votre code joli ce tutoriel utilise une application de base créée dans android studio 4 1 1 avec \<font color="#2166ae">buildtoolsversion=30 0 2\</font> , \<font color="#2166ae">compile sdk version\</font> = \<font color="#2166ae">30 0 2\</font> et \<font color="#2166ae">targetsdkversion 30\</font> à tout moment, vous pouvez accéder au projet complet via nos dépôts github dépôt d'exemple kotlin https //github com/templates back4app/android crud operations kotlin dépôt d'exemple java https //github com/templates back4app/android crud operations 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 https //developer android com/studio/index html une application créée sur back4app remarque suivez le tutoriel de nouvelle application parse https //www back4app com/docs/get started/new parse app pour apprendre à créer une application parse sur back4app une application android connectée à back4app remarque suivez le tutoriel d'installation du sdk parse https //www back4app com/docs/android/parse android sdk pour créer un projet android studio connecté à back4app un appareil (ou appareil virtuel https //developer android com/studio/run/managing avds html ) 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 \<font color="#2166ae">types de données\</font> dans cette \<font color="#2166ae">android\</font> application, vous allez créer tous les types de données dans une classe nommée \<font color="#2166ae">datatypes\</font> 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 \<font color="#2166ae">pointeur\</font> , \<font color="#2166ae">relation\</font> , \<font color="#2166ae">fichier\</font> , \<font color="#2166ae">geopoint\</font> 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 \<font color="#2166ae">mainactivity\</font> et remplacez le code dans la \<font color="#2166ae">oncreate\</font> 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 \<font color="#2166ae">back4app\</font> à notre application vous devez enregistrer le \<font color="#2166ae">appid\</font> et \<font color="#2166ae">clientkey\</font> de \<font color="#2166ae">back4app\</font> dans le fichier \<font color="#2166ae">string xml\</font> puis init \<font color="#2166ae">parse\</font> dans notre fichier \<font color="#2166ae">app java\</font> ou \<font color="#2166ae">app kt\</font> suivez le nouveau tutoriel d'application parse https //www back4app com/docs/android/parse android sdk si vous ne savez pas comment init \<font color="#2166ae">parse\</font> à 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 \<font color="#2166ae">savedatatypes\</font> fonction que nous appelons dans la \<font color="#2166ae">oncreate\</font> 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 \<font color="#2166ae">objectid\</font> variable que nous avons assignée dans le \<font color="#2166ae">savedatatypes\</font> fonction comme paramètre à la requête et lire les données que nous avons sauvegardées dans le \<font color="#2166ae">savedatatypes\</font> fonction avec la \<font color="#2166ae">readobjects\</font> 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 \<font color="#2166ae">données\</font> nous utilisons les données que nous obtenons dans la \<font color="#2166ae">lireobjets\</font> 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 \<font color="#2166ae">données\</font> type ensuite, nous donnons cette liste comme paramètre à la \<font color="#2166ae">montrertypesdedonnées\</font> fonction et la listons dans le \<font color="#2166ae">alertdialog\</font> ceci est le \<font color="#2166ae">données\</font> 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 \<font color="#2166ae">showdatatypes\</font> 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 \<font color="#2166ae">updateobject\</font> fonction est responsable de la mise à jour des données dans l'objet créé sur le \<font color="#2166ae">savedatatypes\</font> fonction nous utilisons \<font color="#2166ae">objectid\</font> à 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 \<font color="#2166ae">intfield\</font> 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 \<font color="#2166ae">setadd\</font> et \<font color="#2166ae">setaddall\</font> ajoute les objets donnés à la fin d'un champ de tableau \<font color="#2166ae">setaddunique\</font> et \<font color="#2166ae">setaddallunique\</font> 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 \<font color="#2166ae">remove\</font> et \<font color="#2166ae">removeall\</font> supprime toutes les instances des objets donnés d'un champ de tableau 6 1 exemples avec add et addall \<font color="#2166ae">liststringfield\</font> a la valeur \["a","b","c","d","e","f","g","g"] 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 \["a","b","c","d","e","e","f","g","g"] 6 2 exemples avec addunique et addallunique \<font color="#2166ae">liststringfield\</font> a la valeur \["a","b","c","d","e"] 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 \<font color="#2166ae">stringlist\</font> champ sera \["a","b","c","d","e","f"] aucune valeur n'a été répétée 6 3 exemples avec removeall \<font color="#2166ae">liststringfield\</font> a la valeur \["a","b","c","d","e","f"] 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 \<font color="#2166ae">stringlist\</font> champ sera \["a","b"] 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' \<font color="#2166ae">remove\</font> 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 \<font color="#2166ae">types de données parse\</font> sur \<font color="#2166ae">android\</font>