Android
Data objects
Android Parse Datentypen: Speichern und Verarbeiten
24 min
datenarten in android analysieren einführung in diesem leitfaden lernen sie die parse datentypen mit android kennen sie werden die parse objekte auf back4app von einer android app lesen und speichern das speichern von daten auf parse basiert auf dem parseobject parseobject jedes parseobject parseobject enthält schlüssel wert paare von json kompatiblen daten diese daten sind schemalos, was bedeutet, dass wir im voraus nicht angeben müssen, welche schlüssel in jedem parseobject parseobject existieren wir können beliebige schlüssel wert paare festlegen, und unser backend wird sie speichern zum beispiel, sagen wir, wir verfolgen die highscores für ein spiel ein einzelnes parseobject parseobject könnte enthalten schlüssel müssen alphanumerische zeichenfolgen sein, und werte können sein string string => string string zahl zahl (primitive numerische werte wie int int , double double ) bool bool => boolean boolean datum/uhrzeit datum/uhrzeit => java util date null null => jsonobject null array array =>jsonarray datei datei => parse datei zeiger zeiger => anderes parseobject relation relation => parserelation geopunkt geopunkt => parsegeopoint jedes parseobject parseobject hat einen klassennamen, den wir verwenden können, um verschiedene arten von daten zu unterscheiden zum beispiel könnten wir das highscore objekt einen gamescore gamescore es gibt auch einige felder, die wir nicht angeben müssen, die jedoch zur bequemlichkeit bereitgestellt werden objectid objectid ist ein eindeutiger identifikator für jedes gespeicherte objekt createdat createdat und updatedat updatedat repräsentieren die zeit, zu der jedes objekt erstellt und zuletzt in der cloud geändert wurde jedes dieser felder wird automatisch von back4app ausgefüllt, wenn wir ein neues parseobject parseobject speichern wir empfehlen ihnen nameyourclasseslikethis nameyourclasseslikethis (uppercamelcase) und nameyourkeyslikethis nameyourkeyslikethis (lowercamelcase), nur um ihren code schön aussehen zu lassen dieses tutorial verwendet eine grundlegende app, die in android studio 4 1 1 mit buildtoolsversion=30 0 2 buildtoolsversion=30 0 2 , compile sdk version compile sdk version = 30 0 2 30 0 2 und targetsdkversion 30 targetsdkversion 30 zu jeder zeit können sie auf das vollständige projekt über unsere github repositories zugreifen kotlin beispiel repository java beispiel repository ziel unser ziel ist es, eine android app zu erstellen, die alle von parse server bereitgestellten datentypen verarbeiten kann hier ist eine vorschau darauf, was wir erreichen werden voraussetzungen um dieses tutorial abzuschließen, benötigen wir android studio eine app, die auf back4app erstellt wurde hinweis befolgen sie das tutorial für neue parse apps um zu lernen, wie man eine parse app auf back4app erstellt eine android app, die mit back4app verbunden ist hinweis befolgen sie das tutorial zur installation des parse sdk um ein android studio projekt zu erstellen, das mit back4app verbunden ist ein gerät (oder virtuelles gerät ) mit android 4 1 (jelly bean) oder neuer verstehen unserer app sie werden eine app für ein besseres verständnis von parse datentypen datentypen in dieser android android app werden sie alle datentypen in einer klasse namens datatypes datatypes erstellen und werte für die variablen dieser klasse zuweisen dann werden wir diese daten lesen und aktualisieren hinweis die datentypen pointer pointer , relation relation , datei datei , geopunkt geopunkt werden später in spezifischen anleitungen behandelt lass uns anfangen! 1 app vorlage erstellen definieren sie die folgenden variablen in der mainactivity mainactivity und ersetzen sie den code in der oncreate oncreate methode durch den folgenden code 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 } bevor wir mit den nächsten schritten fortfahren, müssen wir back4app back4app mit unserer anwendung verbinden sie sollten die appid appid und clientkey clientkey von back4app back4app in die string xml string xml datei einfügen und dann parse parse in unserer app java app java oder app kt app kt datei initialisieren folgen sie dem neuen parse app tutorial wenn sie nicht wissen, wie sie parse parse in ihrer app initialisieren 2 code zum speichern von objekten die erstellungsfunktion wird ein neues objekt in der back4app datenbank erstellen wir definieren die savedatatypes savedatatypes funktion, die wir in der oncreate oncreate funktion aufrufen und verwenden den folgenden code in dieser funktion wir werden alle datentypen mit dieser funktion in das datatypes klassenobjekt speichern 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 zum lesen von objekten wir werden die objectid objectid variable, die wir in der savedatatypes savedatatypes funktion zugewiesen haben, als parameter an die abfrage übergeben und die daten lesen, die wir in der savedatatypes savedatatypes funktion mit der readobjects readobjects funktion 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 diesem abschnitt haben wir eine modellklasse namens daten daten wir verwenden die daten, die wir in der readobjects readobjects funktion erhalten, um objekte aus dieser modellklasse zu erstellen wir geben diese objekte als elemente an die liste, die wir in der daten daten typ erstellt haben dann geben wir diese liste als parameter an die showdatatypes showdatatypes funktion und listen sie im alertdialog alertdialog auf dies ist das daten daten modell 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 } dies ist die showdatatypes showdatatypes funktion 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 zum aktualisieren des objekts die updateobject updateobject funktion ist verantwortlich für die aktualisierung von daten im objekt, das in der savedatatypes savedatatypes funktion erstellt wurde wir verwenden objectid objectid erneut für das aktualisieren des objekts 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 verwendung von zählern das obige beispiel enthält einen häufigen anwendungsfall das intfield intfield feld kann ein zähler sein, den wir kontinuierlich aktualisieren müssen die obige lösung funktioniert, ist jedoch umständlich und kann zu problemen führen, wenn mehrere clients versuchen, denselben zähler zu aktualisieren parse bietet methoden, die jedes zahlenfeld atomar inkrementieren, um bei der speicherung von zählerdaten zu helfen daher kann dasselbe update wie folgt umgeschrieben werden 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 verwendung von listen parse bietet auch methoden an, um beim speichern von listendaten zu helfen es gibt drei operationen, die verwendet werden können, um ein listenfeld atomar zu ändern setadd setadd und setaddall setaddall fügt die angegebenen objekte am ende eines array feldes hinzu setaddunique setaddunique und setaddallunique setaddallunique fügt nur die angegebenen objekte hinzu, die noch nicht in einem array feld enthalten sind die position des einfügens ist nicht garantiert remove remove und removeall removeall entfernt alle instanzen der angegebenen objekte aus einem array feld 6 1 beispiele mit add und addall liststringfield liststringfield hat den wert führen sie den folgenden code aus 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() nach diesem befehl wird das ergebnis des stringlist feldes sein 6 2 beispiele mit addunique und addallunique liststringfield liststringfield hat den wert führen sie den folgenden code aus 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() nach diesem befehl wird das ergebnis des stringlist stringlist feldes sein es wurden keine werte wiederholt 6 3 beispiele mit removeall liststringfield liststringfield hat den wert führen sie den folgenden code aus 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() nach diesem befehl wird das ergebnis des stringlist stringlist feldes sein hinweis dass es derzeit nicht möglich ist, atomar elemente aus einem array im selben speichervorgang hinzuzufügen und zu entfernen wir müssen den speichervorgang für jede unterschiedliche array operation, die wir separat durchführen möchten, aufrufen 7 einzelnes feld aus parseobject entfernen sie können ein einzelnes feld aus einem objekt entfernen, indem sie die remove remove operation verwenden 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() es ist erledigt! an diesem punkt haben wir gelernt parse datentypen parse datentypen auf android android