Belajar Hubungan Data Parse di Android: Panduan Lengkap
19 mnt
hubungan di android pendahuluan dengan menggunakan parse, anda dapat menyimpan objek data yang membangun hubungan di antara mereka untuk memodelkan perilaku ini, setiap \<font color="#2166ae">parseobject\</font> dapat digunakan sebagai nilai dalam \<font color="#2166ae">parseobject\</font> secara internal, kerangka kerja parse akan menyimpan objek yang dirujuk hanya di satu tempat, untuk menjaga konsistensi itu dapat memberi anda kekuatan tambahan saat membangun dan menjalankan kueri yang kompleks ada tiga jenis hubungan utama \<font color="#2166ae">satu ke satu\</font> , yang membangun hubungan langsung antara dua objek dan hanya mereka; \<font color="#2166ae">satu ke banyak\</font> , di mana satu objek dapat terkait dengan banyak objek lainnya; \<font color="#2166ae">banyak ke banyak\</font> , yang dapat menciptakan banyak hubungan kompleks antara banyak objek ada dua cara untuk membuat sebuah \<font color="#2166ae">hubungan satu ke banyak\</font> di parse yang pertama adalah menggunakan \<font color="#2166ae">pointer\</font> di \<font color="#2166ae">kelas anak,\</font> yang merupakan yang tercepat dalam waktu pembuatan dan kueri yang kedua adalah menggunakan \<font color="#2166ae">array\</font> dari \<font color="#2166ae">pointer\</font> di kelas induk yang dapat menyebabkan waktu kueri yang lambat tergantung pada ukuran mereka karena masalah kinerja ini, kami hanya akan menggunakan contoh pointer ada tiga cara untuk membuat sebuah \<font color="#2166ae">hubungan banyak ke banyak\</font> di parse yang pertama adalah menggunakan \<font color="#2166ae">hubungan\</font> , yang merupakan yang tercepat dalam waktu pembuatan dan kueri kami akan menggunakan ini dalam panduan ini yang kedua adalah menggunakan \<font color="#2166ae">array\</font> dari \<font color="#2166ae">pointer\</font> yang dapat menyebabkan waktu kueri yang lambat tergantung pada ukuran mereka yang ketiga adalah menggunakan \<font color="#2166ae">jointable\</font> di mana ide berasal dari basis data klasik ketika ada hubungan banyak ke banyak, kita menggabungkan setiap \<font color="#2166ae">objectid\</font> atau \<font color="#2166ae">pointer\</font> dari kedua sisi bersama sama untuk membangun tabel terpisah baru di mana hubungan tersebut dilacak 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 = 30 0 2\</font> dan \<font color="#2166ae">targetsdkversion 30\</font> kapan saja, anda dapat mengakses proyek android lengkap yang dibangun dengan tutorial ini di repositori github kami repositori contoh kotlin https //github com/templates back4app/android parse sdk kotlin repositori contoh java https //github com/templates back4app/android parse sdk java tujuan tujuan kami adalah, memahami hubungan parse dengan membuat aplikasi buku yang praktis berikut adalah pratinjau tentang apa yang akan kita capai prasyarat untuk menyelesaikan tutorial ini, kita perlu 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 sdk parse 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 buku kelas objek utama yang akan anda gunakan adalah \<font color="#2166ae">buku\</font> kelas, yang menyimpan setiap entri buku dalam pendaftaran juga, ini adalah tiga kelas objek lainnya \<font color="#2166ae">penerbit\</font> nama penerbit buku, \<font color="#2166ae">satu ke banyak\</font> hubungan dengan \<font color="#2166ae">buku\</font> \<font color="#2166ae">genre\</font> genre buku, \<font color="#2166ae">satu ke banyak\</font> hubungan dengan \<font color="#2166ae">buku\</font> perhatikan bahwa untuk contoh ini kita akan menganggap bahwa sebuah buku hanya dapat memiliki satu genre; \<font color="#2166ae">penulis\</font> penulis buku, \<font color="#2166ae">banyak ke banyak\</font> hubungan dengan \<font color="#2166ae">buku\</font> , karena sebuah buku dapat memiliki lebih dari satu penulis dan seorang penulis juga dapat memiliki lebih dari satu buku; representasi visual dari model data ini mari kita mulai! 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 atau anda bisa mengunduh proyek yang kami bagikan tautan github di atas dan hanya mengedit \<font color="#2166ae">appid\</font> dan \<font color="#2166ae">clientkey\</font> bagian sesuai kebutuhan anda 1 simpan dan daftar objek terkait buku dalam langkah ini kita akan melihat bagaimana cara menyimpan dan mencantumkan \<font color="#2166ae">genre\</font> , \<font color="#2166ae">penerbit\</font> dan \<font color="#2166ae">penulis\</font> kelas yang terkait dengan kelas \<font color="#2166ae">buku\</font> 1 1 simpan dan daftar genre kita dapat mendaftarkan sebuah \<font color="#2166ae">genre\</font> menggunakan cuplikan berikut 1 private void addgenre(string name) { 2 //we are taking this name parameter from the input 3 progressdialog show(); 4 parseobject parseobject = new parseobject("genre"); 5 parseobject put("name", name); 6 parseobject saveinbackground(e > { 7 progressdialog dismiss(); 8 if (e == null) { 9 getgenres(); 10 inputgenre settext(""); 11 toast maketext(this, "genre saved successfully", toast length short) show(); 12 } else { 13 toast maketext(this, e getlocalizedmessage(), toast length short) show(); 14 } 15 }); 16 }1 private fun addgenre(name string) { 2 //we are taking this name parameter from the input 3 progressdialog show() 4 val parseobject = parseobject("genre") 5 parseobject put("name", name) 6 parseobject saveinbackground { 7 progressdialog dismiss() 8 if (it == null) { 9 getgenres() 10 inputgenre settext("") 11 toast maketext(this, "genre saved successfully", toast length short) show() 12 } else { 13 toast maketext(this, it localizedmessage, toast length short) show() 14 } 15 } 16 } kita dapat mendaftarkan sebuah \<font color="#2166ae">genre\</font> menggunakan potongan kode berikut 1 private void getgenres() { 2 progressdialog show(); 3 parsequery\<parseobject> query = new parsequery<>("genre"); 4 query findinbackground((objects, e) > { 5 progressdialog dismiss(); 6 list\<parseobjectmodel> list = new arraylist<>(); 7 for (parseobject parseobject objects) { 8 list add(new parseobjectmodel(parseobject)); 9 } 10 11 genreadapter adapter = new genreadapter(list, this); 12 recyclerview\ setlayoutmanager(new linearlayoutmanager(this)); 13 recyclerview\ setadapter(adapter); 14 }); 15 }1 private fun getgenres() { 2 progressdialog show() 3 val query = parsequery\<parseobject>("genre") 4 query findinbackground { objects, e > 5 progressdialog dismiss() 6 var list mutablelist\<parseobjectmodel> = arraylist() 7 for (parseobject in objects) { 8 list add(parseobjectmodel(parseobject)) 9 } 10 val adapter = genreadapter(this, list) 11 recyclerview\ layoutmanager = linearlayoutmanager(this) 12 recyclerview\ adapter = adapter 13 } 14 } 1 2 simpan dan daftar penerbit kita dapat mendaftarkan sebuah \<font color="#2166ae">penerbit\</font> menggunakan cuplikan berikut 1 private void addpublisher(string name) { 2 //we are taking this name parameter from the input 3 progressdialog show(); 4 parseobject parseobject = new parseobject("publisher"); 5 parseobject put("name", name); 6 parseobject saveinbackground(e > { 7 progressdialog dismiss(); 8 if (e == null) { 9 getpublishers(); 10 inputpublisher settext(""); 11 toast maketext(this, "publisher saved successfully", toast length short) show(); 12 } else { 13 toast maketext(this, e getlocalizedmessage(), toast length short) show(); 14 } 15 }); 16 }1 private fun addpublisher(name string) { 2 //we are taking this name parameter from the input 3 progressdialog show() 4 val parseobject = parseobject("publisher") 5 parseobject put("name", name) 6 parseobject saveinbackground { 7 progressdialog dismiss() 8 if (it == null) { 9 getpublishers() 10 inputpublisher settext("") 11 toast maketext(this, "publisher saved successfully", toast length short) show() 12 } else { 13 toast maketext(this, it localizedmessage, toast length short) show() 14 } 15 } 16 } kita dapat mendaftarkan sebuah \<font color="#2166ae">penerbit\</font> menggunakan cuplikan berikut 1 private void getpublishers() { 2 progressdialog show(); 3 parsequery\<parseobject> query = new parsequery<>("publisher"); 4 query findinbackground((objects, e) > { 5 progressdialog dismiss(); 6 list\<parseobjectmodel> list = new arraylist<>(); 7 for (parseobject parseobject objects) { 8 list add(new parseobjectmodel(parseobject)); 9 } 10 11 publisheradapter adapter = new publisheradapter(list, this); 12 recyclerview\ setlayoutmanager(new linearlayoutmanager(this)); 13 recyclerview\ setadapter(adapter); 14 }); 15 }1 private fun getpublishers() { 2 progressdialog show() 3 val query = parsequery\<parseobject>("publisher") 4 query findinbackground { objects, e > 5 progressdialog dismiss() 6 val list arraylist\<parseobjectmodel> = arraylist() 7 for (parseobject in objects) { 8 list add(parseobjectmodel(parseobject)) 9 } 10 11 val adapter = publisheradapter(this, list) 12 recyclerview\ layoutmanager = linearlayoutmanager(this) 13 recyclerview\ adapter = adapter 14 } 15 } 1 3 simpan dan daftar penulis kita dapat mendaftarkan sebuah \<font color="#2166ae">penulis\</font> menggunakan cuplikan berikut 1 private void addauthor(string name){ 2 //we are taking this name parameter from the input 3 progressdialog show(); 4 parseobject parseobject = new parseobject("author"); 5 parseobject put("name", name); 6 parseobject saveinbackground(e > { 7 progressdialog dismiss(); 8 if (e == null) { 9 getauthors(); 10 inputauthor settext(""); 11 toast maketext(this, "author saved successfully", toast length short) show(); 12 } else { 13 toast maketext(this, e getlocalizedmessage(), toast length short) show(); 14 } 15 }); 16 }1 private fun addauthor(name string) { 2 //we are taking this name parameter from the input 3 progressdialog show() 4 val parseobject = parseobject("author") 5 parseobject put("name", name) 6 parseobject saveinbackground { 7 progressdialog dismiss() 8 if (it == null) { 9 getauthors() 10 inputauthor settext("") 11 toast maketext(this, "author saved successfully", toast length short) show() 12 } else { 13 toast maketext(this, it localizedmessage, toast length short) show() 14 } 15 } 16 } kami dapat mendaftar sebuah \<font color="#2166ae">penulis\</font> menggunakan cuplikan berikut 1 private void getauthors() { 2 progressdialog show(); 3 parsequery\<parseobject> query = new parsequery<>("author"); 4 query findinbackground((objects, e) > { 5 progressdialog dismiss(); 6 list\<parseobjectmodel> list = new arraylist<>(); 7 for (parseobject parseobject objects) { 8 list add(new parseobjectmodel(parseobject)); 9 } 10 11 authoradapter adapter = new authoradapter(list, this); 12 recyclerview\ setlayoutmanager(new linearlayoutmanager(this)); 13 recyclerview\ setadapter(adapter); 14 }); 15 }1 private fun getauthors() { 2 progressdialog show() 3 val query = parsequery\<parseobject>("author") 4 query findinbackground { objects list\<parseobject>, e parseexception? > 5 progressdialog dismiss() 6 val list arraylist\<parseobjectmodel> = arraylist() 7 for (parseobject in objects) { 8 list add(parseobjectmodel(parseobject)) 9 } 10 val adapter = authoradapter(this, list) 11 recyclerview\ layoutmanager = linearlayoutmanager(this) 12 recyclerview\ adapter = adapter 13 } 14 } di bagian ini, kami menggunakan kelas model bernama \<font color="#2166ae">parseobjectmodel\</font> dalam kelas model ini, kami memiliki sebuah \<font color="#2166ae">parseobject\</font> variabel untuk dapat membaca data, dan variabel \<font color="#2166ae">ischecked\</font> yang akan kami gunakan untuk menyimpan buku di langkah berikutnya kami akan dapat dengan mudah mengambil objek yang dipilih dengan variabel \<font color="#2166ae">ischecked\</font> berikut adalah model \<font color="#2166ae">parseobjectmodel\</font> kami 1 public class parseobjectmodel { 2 parseobject object; 3 boolean ischecked = false; 4 5 public parseobjectmodel(parseobject object) { 6 this object = object; 7 } 8 9 public parseobject getobject() { 10 return object; 11 } 12 13 public parseobjectmodel setobject(parseobject object) { 14 this object = object; 15 return this; 16 } 17 18 public boolean ischecked() { 19 return ischecked; 20 } 21 22 public parseobjectmodel setchecked(boolean checked) { 23 ischecked = checked; 24 return this; 25 } 26 }1 class parseobjectmodel(obj parseobject) { 2 var obj parseobject? = null 3 var ischecked boolean = false 4 5 init { 6 this obj = obj 7 } 8 } 2 simpan objek buku dan relasinya 2 1 simpan objek buku dengan hubungan 1\ n fungsi ini akan membuat sebuah \<font color="#2166ae">buku\</font> baru di database back4app dengan hubungan 1\ n 1 progressdialog show(); 2 book put("genre", genre); 3 book put("publisher", publisher); 4 book put("title", title); 5 book put("year", year); 6 book saveinbackground(e > { 7 progressdialog hide(); 8 if (e == null) { 9 toast maketext(addbookactivity this, "book saved successfully", toast length short) show(); 10 startactivity(new intent(addbookactivity this, booklistactivity class)); 11 finish(); 12 } else { 13 toast maketext(addbookactivity this, e getlocalizedmessage(), toast length short) show(); 14 } 15 });1 progressdialog show() 2 book put("genre", genre) 3 book put("publisher", publisher!!) 4 book put("title", title) 5 book put("year", year) 6 book saveinbackground { 7 progressdialog hide() 8 if (it == null) { 9 toast maketext(this, "book saved successfully", toast length short) show() 10 startactivity(intent(this\@addbookactivity, booklistactivity class java)) 11 finish() 12 } else { 13 toast maketext(this, it localizedmessage, toast length short) show() 14 } 15 } 2 2 simpan objek buku dengan hubungan n\ n fungsi ini akan membuat sebuah \<font color="#2166ae">buku\</font> baru di database back4app dengan hubungan n\ n untuk hubungan \<font color="#2166ae">penulis\</font> yang dipilih, kita menemukan penulis yang dipilih di adapter dari \<font color="#2166ae">authorrecyclerview\</font> dan menyimpannya sebagai \<font color="#2166ae">parse relation\</font> 1 progressdialog show(); 2 book put("genre", genre); 3 book put("publisher", publisher); 4 book put("title", title); 5 book put("year", year); 6 7 //here we are setting book relation with getselecteditem function of bookauthoradapter 8 if (recyclerviewauthors getadapter() != null) { 9 relation = ((bookauthoradapter) recyclerviewauthors getadapter()) getselecteditems(book); 10 if (relation == null) { 11 toast maketext(this, "please select author/s", toast length short) show(); 12 return; 13 } 14 } else { 15 toast maketext(this, "something went wrong!!", toast length short) show(); 16 return; 17 } 18 19 book saveinbackground(e > { 20 progressdialog hide(); 21 if (e == null) { 22 toast maketext(addbookactivity this, "book saved successfully", toast length short) show(); 23 startactivity(new intent(addbookactivity this, booklistactivity class)); 24 finish(); 25 } else { 26 toast maketext(addbookactivity this, e getlocalizedmessage(), toast length short) show(); 27 } 28 }); 29 30 //this is the function for save author/s relation of book object this function in bookauthoradapter 31 public parserelation\<parseobject> getselecteditems(parseobject parseobject) { 32 parserelation\<parseobject> relation = parseobject getrelation("author relation"); 33 for (parseobjectmodel object this list) { 34 if (object ischecked()) 35 relation add(object getobject()); 36 } 37 return relation; 38 } 1 progressdialog show() 2 book put("genre", genre) 3 book put("publisher", publisher!!) 4 book put("title", title) 5 book put("year", year) 6 7 //here we are setting book relation with getselecteditem function of bookauthoradapter 8 9 if (recyclerviewauthors adapter != null) { 10 relation = (recyclerviewauthors adapter as bookauthoradapter) getselecteditems(book) 11 if (relation == null) { 12 toast maketext(this, "please select author/s", toast length short) show() 13 return 14 } 15 } else { 16 toast maketext(this, "something went wrong!!", toast length short) show() 17 return 18 } 19 20 book saveinbackground { 21 progressdialog hide() 22 if (it == null) { 23 toast maketext(this, "book saved successfully", toast length short) show() 24 startactivity(intent(this\@addbookactivity, booklistactivity class java)) 25 finish() 26 } else { 27 toast maketext(this, it localizedmessage, toast length short) show() 28 } 29 } 30 31 //this is the function for save author/s relation of book object this function in bookauthoradapter 32 33 fun getselecteditems(parseobject parseobject) parserelation\<parseobject>? { 34 var relation\ parserelation\<parseobject>? = parseobject getrelation("author relation") 35 for (obj in this list) { 36 if (obj ischecked) 37 relation? add(obj obj) 38 } 39 return relation 40 } 3 kuery detail buku dengan hubungan dengan fungsi fungsi ini, kami akan mencantumkan \<font color="#2166ae">buku\</font> kami sesuai dengan \<font color="#2166ae">penerbit\</font> pertama, kami mengajukan kueri ke kelas penerbit 1 progressdialog show(); 2 parsequery\<parseobject> query = new parsequery<>("publisher"); 3 query findinbackground((objects, e) > { 4 progressdialog hide(); 5 if (e == null) { 6 booklistadapter adapter = new booklistadapter(objects, this); 7 recyclerview\ setlayoutmanager(new linearlayoutmanager(this)); 8 recyclerview\ setadapter(adapter); 9 } else { 10 toast maketext(this, e getlocalizedmessage(), toast length short) show(); 11 } 12 });1 progressdialog show() 2 val query = parsequery\<parseobject>("publisher") 3 query findinbackground { objects list\<parseobject>?, e parseexception? > 4 progressdialog hide() 5 if (e == null) { 6 val adapter = booklistadapter(this, objects!!) 7 recyclerview\ layoutmanager = linearlayoutmanager(this) 8 recyclerview\ adapter = adapter 9 } else { 10 toast maketext(this, e localizedmessage, toast length short) show() 11 } 12 } dan kemudian kita melakukan query untuk mencantumkan \<font color="#2166ae">buku\</font> yang masing masing \<font color="#2166ae">penerbit\</font> item terkait 1 parseobject object = list get(position); 2 holder title settext(object getstring("name")); 3 parsequery\<parseobject> query = new parsequery<>("book"); 4 query whereequalto("publisher", object); 5 query findinbackground((objects, e) > { 6 if (e == null) { 7 booksadapter adapter = new booksadapter(objects, context); 8 holder books setlayoutmanager(new linearlayoutmanager(context)); 9 holder books setadapter(adapter); 10 } else { 11 toast maketext(context, e getlocalizedmessage(), toast length short) show(); 12 } 13 });1 val `object` = list\[position] 2 holder title text = `object` getstring("name") 3 val query = parsequery\<parseobject>("book") 4 query whereequalto("publisher", `object`) 5 query findinbackground { objects list\<parseobject>?, e parseexception? > 6 if (e == null) { 7 val adapter = booksadapter(context, objects!!) 8 holder books layoutmanager = linearlayoutmanager(context) 9 holder books adapter = adapter 10 } else { 11 toast maketext(context, e localizedmessage, toast length short) show() 12 } 13 } sekarang, ketika kita mengklik objek \<font color="#2166ae">buku\</font> mana pun, kita mengirimkan object id dari \<font color="#2166ae">buku\</font> ini dengan sebuah intent ke halaman yang akan menampilkan detail dari \<font color="#2166ae">buku\</font> dan kita mendapatkan semua detail dari \<font color="#2166ae">buku \</font> dari database dengan menggunakan object id ini di halaman tersebut 1 private void getbookwithdetails() { 2 progressdialog show(); 3 parsequery\<parseobject> query = new parsequery<>("book"); 4 query getinbackground(getintent() getstringextra("objectid"), (object, e) > { 5 if (e == null) { 6 booktitle settext("title " +object getstring("title")); 7 bookyear settext("year " +object getstring("year")); 8 try { 9 bookgenre settext("genre " +object getparseobject("genre") fetchifneeded() getstring("name")); 10 } catch (parseexception parseexception) { 11 parseexception printstacktrace(); 12 } 13 try { 14 bookpublisher settext("publisher " + object getparseobject("publisher") fetchifneeded() getstring("name")); 15 } catch (parseexception parseexception) { 16 parseexception printstacktrace(); 17 } 18 19 object getrelation("author relation") getquery() findinbackground((objects, e1) > { 20 progressdialog hide(); 21 if (e1 == null) { 22 bookdetailauthoradapter adapter = new bookdetailauthoradapter(objects, this); 23 authorrecyclerview\ setlayoutmanager(new linearlayoutmanager(this)); 24 authorrecyclerview\ setadapter(adapter); 25 } else { 26 toast maketext(this, e getlocalizedmessage(), toast length short) show(); 27 } 28 }); 29 } else { 30 progressdialog hide(); 31 toast maketext(this, e getlocalizedmessage(), toast length short) show(); 32 } 33 }); 34 }1 private fun getbookwithdetails() { 2 progressdialog show() 3 val query = parsequery\<parseobject>("book") 4 5 query getinbackground(intent getstringextra("objectid")) { `object`, e > 6 if (e == null) { 7 booktitle text = "title " + `object` getstring("title") 8 bookyear text = "year " + `object` getstring("year") 9 try { 10 bookgenre text = "genre " + `object` getparseobject("genre")? fetchifneeded\<parseobject>()? getstring("name") 11 } catch (parseexception parseexception) { 12 parseexception printstacktrace() 13 } 14 try { 15 bookpublisher text = 16 "publisher " + `object` getparseobject("publisher")? fetchifneeded\<parseobject>()? getstring("name") 17 } catch (parseexception parseexception) { 18 parseexception printstacktrace() 19 } 20 21 `object` getrelation\<parseobject>("author relation") query findinbackground { objects, e1 > 22 progressdialog hide() 23 if (e1 == null) { 24 val adapter = bookdetailauthoradapter(this, objects) 25 authorrecyclerview\ layoutmanager = linearlayoutmanager(this) 26 authorrecyclerview\ adapter = adapter 27 } else { 28 toast maketext(this, e1 localizedmessage, toast length short) show() 29 } 30 } 31 } else { 32 progressdialog hide() 33 toast maketext(this, e localizedmessage, toast length short) show() 34 } 35 } 36 } selesai! pada titik ini, kita telah belajar \<font color="#2166ae">hubungan parse\</font> di \<font color="#2166ae">android\</font>