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 \<font color="#2166ae">parseobject\</font> setiap \<font color="#2166ae">parseobject\</font> 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 \<font color="#2166ae">parseobject\</font> 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 \<font color="#2166ae">parseobject\</font> dapat berisi 1 skor 1337 , namapemain "sean plott" , modecurang false kunci harus berupa string alfanumerik, dan nilai dapat berupa \<font color="#2166ae">string\</font> => \<font color="#2166ae">string\</font> \<font color="#2166ae">number\</font> (nilai numerik primitif seperti \<font color="#2166ae">int\</font> , \<font color="#2166ae">double\</font> ) \<font color="#2166ae">bool\</font> => \<font color="#2166ae">boolean\</font> \<font color="#2166ae">datetime\</font> => java util date \<font color="#2166ae">null\</font> => jsonobject null \<font color="#2166ae">array\</font> =>jsonarray \<font color="#2166ae">file\</font> => parse file \<font color="#2166ae">pointer\</font> => objek parse lainnya \<font color="#2166ae">relation\</font> => parserelation \<font color="#2166ae">geopoint\</font> => parsegeopoint setiap \<font color="#2166ae">parseobject\</font> memiliki nama kelas yang dapat kita gunakan untuk membedakan berbagai jenis data misalnya, kita bisa menyebut objek skor tertinggi sebagai \<font color="#2166ae">gamescore\</font> ada juga beberapa bidang yang tidak perlu kita tentukan yang disediakan sebagai kenyamanan \<font color="#2166ae">objectid\</font> adalah pengidentifikasi unik untuk setiap objek yang disimpan \<font color="#2166ae">createdat\</font> dan \<font color="#2166ae">updatedat\</font> 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 \<font color="#2166ae">parseobject\</font> yang baru kami merekomendasikan anda \<font color="#2166ae">nameyourclasseslikethis\</font> (uppercamelcase) dan \<font color="#2166ae">nameyourkeyslikethis \</font> (lowercamelcase), hanya untuk menjaga agar kode anda terlihat rapi tutorial ini menggunakan aplikasi dasar yang dibuat di android studio 4 1 1 dengan \<font color="#2166ae">buildtoolsversion=30 0 2\</font> , \<font color="#2166ae">compile sdk version\</font> = \<font color="#2166ae">30 0 2\</font> dan \<font color="#2166ae">targetsdkversion 30\</font> kapan saja, anda dapat mengakses proyek lengkap melalui repositori github kami repositori contoh kotlin https //github com/templates back4app/android crud operations kotlin repositori contoh java https //github com/templates back4app/android crud operations 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 https //developer android com/studio/index html sebuah aplikasi yang dibuat di back4app catatan ikuti tutorial aplikasi parse baru https //www back4app com/docs/get started/new parse app untuk belajar cara membuat aplikasi parse di back4app sebuah aplikasi android yang terhubung ke back4app catatan ikuti tutorial instalasi parse sdk https //www back4app com/docs/android/parse android sdk untuk membuat proyek android studio yang terhubung ke back4app sebuah perangkat (atau perangkat virtual https //developer android com/studio/run/managing avds html ) 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 \<font color="#2166ae">tipe data\</font> dalam aplikasi \<font color="#2166ae">android\</font> ini, anda akan membuat semua tipe data dalam kelas bernama \<font color="#2166ae">datatypes\</font> dan menetapkan nilai ke variabel kelas ini kemudian kita akan membaca dan memperbarui data ini catatan tipe data \<font color="#2166ae">pointer\</font> , \<font color="#2166ae">relasi\</font> , \<font color="#2166ae">file\</font> , \<font color="#2166ae">geopoint\</font> akan dibahas nanti dalam panduan khusus mari kita mulai! 1 buat template aplikasi tentukan variabel berikut dalam \<font color="#2166ae">mainactivity\</font> dan ganti kode dalam \<font color="#2166ae">oncreate\</font> 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 \<font color="#2166ae">back4app\</font> ke aplikasi kita anda harus menyimpan \<font color="#2166ae">appid\</font> dan \<font color="#2166ae">clientkey\</font> dari \<font color="#2166ae">back4app\</font> ke \<font color="#2166ae">string xml\</font> file dan kemudian inisialisasi \<font color="#2166ae">parse\</font> di \<font color="#2166ae">app java\</font> atau \<font color="#2166ae">app kt\</font> file ikuti tutorial aplikasi parse baru https //www back4app com/docs/android/parse android sdk jika anda tidak tahu cara menginisialisasi \<font color="#2166ae">parse\</font> ke aplikasi anda 2 kode untuk menyimpan objek fungsi create akan membuat objek baru di database back4app kami mendefinisikan \<font color="#2166ae">savedatatypes\</font> fungsi yang kami panggil di \<font color="#2166ae">oncreate\</font> 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 \<font color="#2166ae">objectid\</font> variabel yang telah kami tetapkan di \<font color="#2166ae">savedatatypes\</font> fungsi sebagai parameter untuk kueri dan membaca data yang telah kami simpan di \<font color="#2166ae">savedatatypes\</font> fungsi dengan \<font color="#2166ae">readobjects\</font> 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 \<font color="#2166ae">data\</font> kami menggunakan data yang kami dapatkan di \<font color="#2166ae">readobjects\</font> fungsi untuk membuat objek dari kelas model ini kami memberikan objek objek ini sebagai elemen ke dalam daftar yang kami buat di \<font color="#2166ae">data\</font> tipe kemudian kami memberikan daftar ini sebagai parameter ke \<font color="#2166ae">showdatatypes\</font> fungsi dan mencantumkannya di \<font color="#2166ae">alertdialog\</font> ini adalah \<font color="#2166ae">data\</font> 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 \<font color="#2166ae">showdatatypes\</font> 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 \<font color="#2166ae">updateobject\</font> bertanggung jawab untuk memperbarui data dalam objek yang dibuat pada fungsi \<font color="#2166ae">savedatatypes\</font> kami menggunakan \<font color="#2166ae">objectid\</font> 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 \<font color="#2166ae">intfield\</font> 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 \<font color="#2166ae">setadd\</font> dan \<font color="#2166ae">setaddall\</font> menambahkan objek yang diberikan ke akhir bidang array \<font color="#2166ae">setaddunique\</font> dan \<font color="#2166ae">setaddallunique\</font> hanya menambahkan objek yang diberikan yang tidak sudah ada dalam bidang array ke bidang tersebut posisi penyisipan tidak dijamin \<font color="#2166ae">remove\</font> dan \<font color="#2166ae">removeall\</font> menghapus semua instance dari objek yang diberikan dari bidang array 6 1 contoh dengan add dan addall \<font color="#2166ae">liststringfield\</font> memiliki nilai \["a","b","c","d","e","f","g","g"] 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 \["a","b","c","d","e","e","f","g","g"] 6 2 contoh dengan addunique dan addallunique \<font color="#2166ae">liststringfield\</font> memiliki nilai \["a","b","c","d","e"] 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 \<font color="#2166ae">stringlist\</font> field akan menjadi \["a","b","c","d","e","f"] tidak ada nilai yang diulang 6 3 contoh dengan removeall \<font color="#2166ae">liststringfield\</font> memiliki nilai \["a","b","c","d","e","f"] 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 \<font color="#2166ae">stringlist\</font> field akan menjadi \["a","b"] 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 \<font color="#2166ae">remove\</font> 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 \<font color="#2166ae">tipe data parse\</font> di \<font color="#2166ae">android\</font>