Android
Data objects
Guida ai Tipi di Dati Parse con Android per Sviluppatori
23 min
analizzare i tipi di dati su android introduzione in questa guida, imparerai a conoscere i tipi di dati parse utilizzando android leggerai e salverai gli oggetti parse su back4app da un'app android memorizzare dati su parse è costruito attorno al parseobject parseobject ogni parseobject parseobject contiene coppie chiave valore di dati compatibili con json questi dati sono senza schema, il che significa che non dobbiamo specificare in anticipo quali chiavi esistono su ogni parseobject parseobject possiamo impostare qualsiasi coppia chiave valore vogliamo, e il nostro backend le memorizzerà ad esempio, diciamo che stiamo tracciando i punteggi più alti per un gioco un singolo parseobject parseobject potrebbe contenere le chiavi devono essere stringhe alfanumeriche e i valori possono essere stringa stringa => stringa stringa numero numero (valori numerici primitivi come int int , double double ) bool bool => boolean boolean datetime datetime => java util date null null => jsonobject null array array =>jsonarray file file => parse file pointer pointer => altro parseobject relation relation => parserelation geopoint geopoint => parsegeopoint ogni parseobject parseobject ha un nome di classe che possiamo usare per distinguere diversi tipi di dati ad esempio, potremmo chiamare l'oggetto del punteggio più alto un gamescore gamescore ci sono anche alcuni campi che non dobbiamo specificare che sono forniti per comodità objectid objectid è un identificatore unico per ogni oggetto salvato createdat createdat e updatedat updatedat rappresentano il momento in cui ogni oggetto è stato creato e l'ultima volta che è stato modificato nel cloud ognuno di questi campi è automaticamente compilato da back4app nel momento in cui salviamo un nuovo parseobject parseobject ti consigliamo di nameyourclasseslikethis nameyourclasseslikethis (uppercamelcase) e nameyourkeyslikethis nameyourkeyslikethis (lowercamelcase), solo per mantenere il tuo codice bello questo tutorial utilizza un'app di base creata in android studio 4 1 1 con buildtoolsversion=30 0 2 buildtoolsversion=30 0 2 , compile sdk version compile sdk version = 30 0 2 30 0 2 e targetsdkversion 30 targetsdkversion 30 in qualsiasi momento, puoi accedere al progetto completo tramite i nostri repository github repository di esempio kotlin repository di esempio java obiettivo il nostro obiettivo è creare un'app android che possa elaborare tutti i tipi di dati forniti da parse server ecco un'anteprima di ciò che realizzeremo requisiti per completare questo tutorial, abbiamo bisogno di android studio un'app creata su back4app nota segui il tutorial per la nuova app parse per imparare a creare un'app parse su back4app un'app android collegata a back4app nota segui il tutorial per installare il sdk parse per creare un progetto android studio collegato a back4app un dispositivo (o dispositivo virtuale ) che esegue android 4 1 (jelly bean) o versioni successive comprendere la nostra app creerai un'app per una migliore comprensione di parse tipi di dati tipi di dati in questa android android app, creerai tutti i tipi di dati in una classe chiamata datatypes datatypes e assegnerai valori alle variabili di questa classe poi leggeremo e aggiorneremo questi dati nota i tipi di dati puntatore puntatore , relazione relazione , file file , geopoint geopoint saranno trattati più avanti in guide specifiche iniziamo! 1 crea il modello dell'app definisci le seguenti variabili in mainactivity mainactivity e sostituisci il codice nel oncreate oncreate metodo con il seguente codice 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 } prima dei prossimi passi, dobbiamo connettere back4app back4app alla nostra applicazione dovresti salvare il appid appid e clientkey clientkey da back4app back4app nel file string xml string xml e poi inizializza parse parse nel nostro app java app java o app kt app kt file segui il nuovo tutorial per l'app parse se non sai come inizializzare parse parse nella tua app 2 codice per salvare oggetto la funzione di creazione creerà un nuovo oggetto nel database di back4app definiamo la savedatatypes savedatatypes funzione che chiamiamo nella oncreate oncreate funzione e utilizziamo il seguente codice in questa funzione salveremo tutti i tipi di dati con questa funzione nell'oggetto delle classi 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 codice per leggere oggetto daremo la objectid objectid variabile che abbiamo assegnato nella savedatatypes savedatatypes funzione come parametro alla query e leggere i dati che abbiamo salvato nella savedatatypes savedatatypes funzione con la readobjects readobjects funzione 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 } in questa sezione, abbiamo creato una classe modello chiamata data data utilizziamo i dati che otteniamo nella funzione readobjects readobjects per creare oggetti da questa classe modello forniamo questi oggetti come elementi alla lista che abbiamo creato nel tipo data data poi diamo questa lista come parametro alla funzione showdatatypes showdatatypes e la elenchiamo nell' alertdialog alertdialog questo è il data data modello 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 } questa è la showdatatypes showdatatypes funzione 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 codice per aggiornare l'oggetto la updateobject updateobject funzione è responsabile dell'aggiornamento dei dati nell'oggetto creato nella savedatatypes savedatatypes funzione stiamo usando objectid objectid di nuovo per aggiornare l'oggetto 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 utilizzo dei contatori l'esempio sopra contiene un caso d'uso comune il intfield intfield campo può essere un contatore che dovremo aggiornare continuamente la soluzione sopra funziona, ma è ingombrante e può portare a problemi se abbiamo più client che cercano di aggiornare lo stesso contatore parse fornisce metodi che incrementano in modo atomico qualsiasi campo numerico per aiutare a memorizzare dati di tipo contatore quindi, lo stesso aggiornamento può essere riscritto come 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 utilizzo delle liste parse fornisce anche metodi per aiutare a memorizzare i dati delle liste ci sono tre operazioni che possono essere utilizzate per modificare un campo lista in modo atomico setadd setadd e setaddall setaddall aggiunge gli oggetti dati alla fine di un campo array setaddunique setaddunique e setaddallunique setaddallunique aggiunge solo gli oggetti dati che non sono già contenuti in un campo array a quel campo la posizione dell'inserimento non è garantita remove remove e removeall removeall rimuove tutte le istanze degli oggetti dati da un campo array 6 1 esempi con add e addall liststringfield liststringfield ha il valore eseguendo il codice qui sotto 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() dopo questo comando, il risultato del campo stringlist sarà 6 2 esempi con addunique e addallunique liststringfield liststringfield ha il valore eseguendo il codice qui sotto 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() dopo questo comando, il risultato del stringlist stringlist campo sarà nessun valore è stato ripetuto 6 3 esempi con removeall liststringfield liststringfield ha il valore eseguendo il codice qui sotto 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() dopo questo comando, il risultato del stringlist stringlist campo sarà nota che attualmente non è possibile aggiungere e rimuovere in modo atomico elementi da un array nella stessa operazione di salvataggio dovremo chiamare il salvataggio per ogni operazione di array diversa che vogliamo eseguire separatamente 7 rimuovi un singolo campo da parseobject puoi eliminare un singolo campo da un oggetto utilizzando l'operazione remove remove 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() è fatto! a questo punto, abbiamo imparato tipi di dati parse tipi di dati parse su android android