Android
Data objects
Panduan Lengkap Tipe Data di Android dengan Parse
23 mnt
tipe data parse di android pendahuluan dalam panduan ini, anda akan belajar tentang tipe data parse menggunakan android anda akan membaca dan menyimpan objek parse di back4app dari aplikasi android menyimpan data di parse dibangun di sekitar parseobject parseobject setiap parseobject parseobject berisi pasangan kunci nilai dari data yang kompatibel dengan json data ini tidak memiliki skema, yang berarti kita tidak perlu menentukan sebelumnya kunci apa yang ada di setiap parseobject parseobject kita dapat menetapkan pasangan kunci nilai apa pun yang kita inginkan, dan backend kita akan menyimpannya misalnya, katakanlah kita melacak skor tinggi untuk sebuah permainan sebuah parseobject parseobject dapat berisi kunci harus berupa string alfanumerik, dan nilai dapat berupa string string => string string number number (nilai numerik primitif seperti 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 => objek parse lainnya relation relation => parserelation geopoint geopoint => parsegeopoint setiap parseobject parseobject memiliki nama kelas yang dapat kita gunakan untuk membedakan berbagai jenis data misalnya, kita bisa menyebut objek skor tertinggi sebagai gamescore gamescore ada juga beberapa bidang yang tidak perlu kita tentukan yang disediakan sebagai kenyamanan objectid objectid adalah pengidentifikasi unik untuk setiap objek yang disimpan createdat createdat dan updatedat updatedat mewakili waktu di mana setiap objek dibuat dan terakhir dimodifikasi di cloud setiap bidang ini secara otomatis diisi oleh back4app pada saat kita menyimpan sebuah parseobject parseobject yang baru kami merekomendasikan anda nameyourclasseslikethis nameyourclasseslikethis (uppercamelcase) dan nameyourkeyslikethis nameyourkeyslikethis (lowercamelcase), hanya untuk menjaga agar kode anda terlihat rapi tutorial ini menggunakan aplikasi dasar yang dibuat di android studio 4 1 1 dengan buildtoolsversion=30 0 2 buildtoolsversion=30 0 2 , compile sdk version compile sdk version = 30 0 2 30 0 2 dan targetsdkversion 30 targetsdkversion 30 kapan saja, anda dapat mengakses proyek lengkap melalui repositori github kami repositori contoh kotlin repositori contoh java tujuan tujuan kami adalah untuk membuat aplikasi android yang dapat memproses semua jenis data yang disediakan oleh parse server berikut adalah pratinjau tentang apa yang akan kami capai prasyarat untuk menyelesaikan tutorial ini, kami membutuhkan android studio sebuah aplikasi yang dibuat di back4app catatan ikuti tutorial aplikasi parse baru untuk belajar cara membuat aplikasi parse di back4app sebuah aplikasi android yang terhubung ke back4app catatan ikuti tutorial instalasi parse sdk untuk membuat proyek android studio yang terhubung ke back4app sebuah perangkat (atau perangkat virtual ) yang menjalankan android 4 1 (jelly bean) atau yang lebih baru memahami aplikasi kami anda akan membuat aplikasi untuk pemahaman yang lebih baik tentang parse tipe data tipe data dalam aplikasi android android ini, anda akan membuat semua tipe data dalam kelas bernama datatypes datatypes dan menetapkan nilai ke variabel kelas ini kemudian kita akan membaca dan memperbarui data ini catatan tipe data pointer pointer , relasi relasi , file file , geopoint geopoint akan dibahas nanti dalam panduan khusus mari kita mulai! 1 buat template aplikasi tentukan variabel berikut dalam mainactivity mainactivity dan ganti kode dalam oncreate oncreate metode dengan kode berikut 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 } sebelum langkah selanjutnya, kita perlu menghubungkan back4app back4app ke aplikasi kita anda harus menyimpan appid appid dan clientkey clientkey dari back4app back4app ke string xml string xml file dan kemudian inisialisasi parse parse di app java app java atau app kt app kt file ikuti tutorial aplikasi parse baru jika anda tidak tahu cara menginisialisasi parse parse ke aplikasi anda 2 kode untuk menyimpan objek fungsi create akan membuat objek baru di database back4app kami mendefinisikan savedatatypes savedatatypes fungsi yang kami panggil di oncreate oncreate fungsi dan menggunakan kode berikut dalam fungsi ini kami akan menyimpan semua jenis data dengan fungsi ini ke objek kelas 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 kode untuk membaca objek kami akan memberikan objectid objectid variabel yang telah kami tetapkan di savedatatypes savedatatypes fungsi sebagai parameter untuk kueri dan membaca data yang telah kami simpan di savedatatypes savedatatypes fungsi dengan readobjects readobjects fungsi 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 } dalam bagian ini, kami telah membuat kelas model yang disebut data data kami menggunakan data yang kami dapatkan di readobjects readobjects fungsi untuk membuat objek dari kelas model ini kami memberikan objek objek ini sebagai elemen ke dalam daftar yang kami buat di data data tipe kemudian kami memberikan daftar ini sebagai parameter ke showdatatypes showdatatypes fungsi dan mencantumkannya di alertdialog alertdialog ini adalah data data model 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 } ini adalah showdatatypes showdatatypes fungsi 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 kode untuk memperbarui objek fungsi updateobject updateobject bertanggung jawab untuk memperbarui data dalam objek yang dibuat pada fungsi savedatatypes savedatatypes kami menggunakan objectid objectid lagi untuk memperbarui objek 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 menggunakan penghitung contoh di atas mengandung kasus penggunaan yang umum field intfield intfield dapat menjadi penghitung yang perlu kita perbarui secara terus menerus solusi di atas berfungsi, tetapi merepotkan dan dapat menyebabkan masalah jika kita memiliki beberapa klien yang mencoba memperbarui penghitung yang sama parse menyediakan metode yang secara atomik meningkatkan field angka apa pun untuk membantu menyimpan data tipe penghitung jadi, pembaruan yang sama dapat ditulis ulang sebagai 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 menggunakan daftar parse juga menyediakan metode untuk membantu dalam menyimpan data daftar ada tiga operasi yang dapat digunakan untuk mengubah bidang daftar secara atomik setadd setadd dan setaddall setaddall menambahkan objek yang diberikan ke akhir bidang array setaddunique setaddunique dan setaddallunique setaddallunique hanya menambahkan objek yang diberikan yang tidak sudah ada dalam bidang array ke bidang tersebut posisi penyisipan tidak dijamin remove remove dan removeall removeall menghapus semua instance dari objek yang diberikan dari bidang array 6 1 contoh dengan add dan addall liststringfield liststringfield memiliki nilai menjalankan kode di bawah ini 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() setelah perintah ini, hasil dari field stringlist akan menjadi 6 2 contoh dengan addunique dan addallunique liststringfield liststringfield memiliki nilai menjalankan kode di bawah ini 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() setelah perintah ini, hasil dari stringlist stringlist field akan menjadi tidak ada nilai yang diulang 6 3 contoh dengan removeall liststringfield liststringfield memiliki nilai menjalankan kode di bawah ini 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() setelah perintah ini, hasil dari stringlist stringlist field akan menjadi catatan bahwa saat ini tidak mungkin untuk menambahkan dan menghapus item dari array secara atomik dalam penyimpanan yang sama kita harus memanggil penyimpanan untuk setiap operasi array yang berbeda yang ingin kita lakukan secara terpisah 7 hapus field tunggal dari parseobject anda dapat menghapus satu field dari objek dengan menggunakan remove remove operasi 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() selesai! pada titik ini, kita telah belajar tipe data parse tipe data parse di android android