Android
Data objects
การจัดการ Parse Data Types บน Android
23 นาที
การวิเคราะห์ประเภทข้อมูลบน android บทนำ ในคู่มือนี้ คุณจะได้เรียนรู้เกี่ยวกับประเภทข้อมูล parse โดยใช้ android คุณจะอ่านและบันทึกวัตถุ parse บน back4app จากแอป android การจัดเก็บข้อมูลบน parse ถูกสร้างขึ้นรอบๆ parseobject parseobject แต่ละ parseobject parseobject ประกอบด้วยคู่คีย์ ค่า ของข้อมูลที่เข้ากันได้กับ json ข้อมูลนี้ไม่มีโครงสร้าง ซึ่งหมายความว่าเราไม่จำเป็นต้องระบุล่วงหน้าว่าคีย์ใดมีอยู่ในแต่ละ parseobject parseobject เราสามารถตั้งค่าคู่คีย์ ค่า ใดก็ได้ที่เราต้องการ และแบ็กเอนด์ของเราจะจัดเก็บพวกมัน สำหรับตัวอย่าง สมมติว่าเรากำลังติดตามคะแนนสูงสุดสำหรับเกมหนึ่ง parseobject parseobject อาจประกอบด้วย คีย์ต้องเป็นสตริงที่ประกอบด้วยตัวอักษรและตัวเลข และค่าต่างๆ สามารถเป็น สตริง สตริง => สตริง สตริง หมายเลข หมายเลข (ค่าตัวเลขพื้นฐาน เช่น int int , double double ) บูล บูล => boolean boolean วันที่และเวลา วันที่และเวลา => java util date ว่าง ว่าง => jsonobject null อาเรย์ อาเรย์ =>jsonarray ไฟล์ ไฟล์ => parse file พอยเตอร์ พอยเตอร์ => อื่นๆ parseobject ความสัมพันธ์ ความสัมพันธ์ => parserelation จุดภูมิศาสตร์ จุดภูมิศาสตร์ => parsegeopoint แต่ละ parseobject parseobject มีชื่อคลาสที่เราสามารถใช้เพื่อแยกแยะประเภทข้อมูลที่แตกต่างกัน สำหรับตัวอย่าง เราสามารถเรียกวัตถุคะแนนสูงว่า gamescore gamescore นอกจากนี้ยังมีฟิลด์บางอย่างที่เราไม่จำเป็นต้องระบุซึ่งมีให้เพื่อความสะดวก objectid objectid เป็นตัวระบุที่ไม่ซ้ำกันสำหรับแต่ละวัตถุที่บันทึกไว้ createdat createdat และ updatedat updatedat แสดงถึงเวลาที่วัตถุแต่ละชิ้นถูกสร้างขึ้นและแก้ไขล่าสุดในคลาวด์ แต่ละฟิลด์เหล่านี้จะถูกกรอกโดยอัตโนมัติจาก back4app ในขณะที่เราบันทึก parseobject parseobject ใหม่ เราขอแนะนำให้คุณ nameyourclasseslikethis nameyourclasseslikethis (uppercamelcase) และ nameyourkeyslikethis nameyourkeyslikethis (lowercamelcase) เพื่อให้โค้ดของคุณดูสวยงาม บทเรียนนี้ใช้แอปพื้นฐานที่สร้างขึ้นใน android studio 4 1 1 โดยมี buildtoolsversion=30 0 2 buildtoolsversion=30 0 2 , compile sdk version compile sdk version = 30 0 2 30 0 2 และ targetsdkversion 30 targetsdkversion 30 ในทุกช่วงเวลา คุณสามารถเข้าถึงโปรเจกต์ทั้งหมดได้ผ่าน github repositories ของเรา kotlin example repository java example repository เป้าหมาย เป้าหมายของเราคือการสร้างแอป android ที่สามารถประมวลผลข้อมูลทุกประเภทที่จัดเตรียมโดย parse server นี่คือภาพรวมของสิ่งที่เราจะทำให้สำเร็จ ข้อกำหนดเบื้องต้น ในการทำตามบทเรียนนี้ เราต้องการ android studio แอปที่สร้างขึ้นบน back4app หมายเหตุ ติดตาม บทเรียนการสร้าง parse app ใหม่ เพื่อเรียนรู้วิธีการสร้าง parse app บน back4app แอป android ที่เชื่อมต่อกับ back4app หมายเหตุ ติดตาม บทเรียนการติดตั้ง parse sdk เพื่อสร้างโปรเจกต์ android studio ที่เชื่อมต่อกับ back4app อุปกรณ์ (หรือ อุปกรณ์เสมือน ) ที่รัน android 4 1 (jelly bean) หรือใหม่กว่า การทำความเข้าใจแอปของเรา คุณจะสร้างแอปเพื่อให้เข้าใจ parse ประเภทข้อมูล ประเภทข้อมูล ในแอป android android นี้ คุณจะสร้างประเภทข้อมูลทั้งหมดในคลาสที่ชื่อว่า datatypes datatypes และกำหนดค่าให้กับตัวแปรในคลาสนี้ จากนั้นเราจะอ่านและอัปเดตข้อมูลนี้ หมายเหตุ ประเภทข้อมูล pointer pointer , relation relation , file file , geopoint geopoint จะถูกกล่าวถึงในภายหลังในคู่มือเฉพาะ เริ่มกันเลย! 1 สร้างเทมเพลตแอป กำหนดตัวแปรต่อไปนี้ใน mainactivity mainactivity และแทนที่โค้ดใน oncreate oncreate เมธอดด้วยโค้ดต่อไปนี้ 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 } ก่อนที่จะดำเนินการต่อ เราจำเป็นต้องเชื่อมต่อ back4app back4app กับแอปพลิเคชันของเรา คุณควรบันทึก appid appid และ clientkey clientkey จาก back4app back4app ไปยัง string xml string xml ไฟล์ และจากนั้นให้เริ่มต้น parse parse ใน app java app java หรือ app kt app kt ไฟล์。 ติดตาม บทเรียนการสร้างแอป parse ใหม่ หากคุณไม่รู้ว่าจะเริ่มต้น parse parse ในแอปของคุณอย่างไร 2 รหัสสำหรับบันทึกวัตถุ ฟังก์ชันสร้างจะสร้างวัตถุใหม่ในฐานข้อมูล back4app เรากำหนด savedatatypes savedatatypes ฟังก์ชันที่เราจะเรียกใน oncreate oncreate ฟังก์ชันและใช้รหัสต่อไปนี้ในฟังก์ชันนี้ เราจะบันทึกประเภทข้อมูลทั้งหมดด้วยฟังก์ชันนี้ไปยังวัตถุ datatypes classes 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 รหัสสำหรับอ่านวัตถุ เราจะให้ objectid objectid ตัวแปรที่เราได้กำหนดใน savedatatypes savedatatypes ฟังก์ชันเป็นพารามิเตอร์สำหรับการค้นหาและอ่านข้อมูลที่เราได้บันทึกใน savedatatypes savedatatypes ฟังก์ชันด้วย readobjects readobjects ฟังก์ชัน 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 } ในส่วนนี้ เราได้สร้างคลาสโมเดลที่เรียกว่า data data เราใช้ข้อมูลที่เราได้รับใน readobjects readobjects ฟังก์ชันเพื่อสร้างวัตถุจากคลาสโมเดลนี้ เราให้วัตถุเหล่านี้เป็นองค์ประกอบในรายการที่เราสร้างใน data data ประเภท จากนั้นเราจะให้รายการนี้เป็นพารามิเตอร์แก่ showdatatypes showdatatypes ฟังก์ชันและแสดงใน alertdialog alertdialog นี่คือ ข้อมูล ข้อมูล โมเดล 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 } นี่คือ showdatatypes showdatatypes ฟังก์ชัน 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 รหัสสำหรับอัปเดตวัตถุ ฟังก์ชัน updateobject updateobject มีหน้าที่รับผิดชอบในการอัปเดตข้อมูลในวัตถุที่สร้างขึ้นในฟังก์ชัน savedatatypes savedatatypes เรากำลังใช้ objectid objectid อีกครั้งสำหรับการอัปเดตวัตถุ 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 การใช้ตัวนับ ตัวอย่างข้างต้นมีกรณีการใช้งานทั่วไป ฟิลด์ intfield intfield สามารถเป็นตัวนับที่เราต้องอัปเดตอย่างต่อเนื่อง วิธีการข้างต้นทำงานได้ แต่ยุ่งยากและอาจนำไปสู่ปัญหาหากเรามีลูกค้าหลายรายพยายามอัปเดตตัวนับเดียวกัน parse มีวิธีการที่เพิ่มฟิลด์จำนวนใด ๆ อย่างอะตอมเพื่อช่วยในการจัดเก็บข้อมูลประเภทตัวนับ ดังนั้น การอัปเดตเดียวกันสามารถเขียนใหม่ได้ว่า 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 การใช้รายการ parse ยังมีวิธีการในการช่วยในการจัดเก็บข้อมูลรายการ มีสามการดำเนินการที่สามารถใช้เพื่อเปลี่ยนแปลงฟิลด์รายการอย่างเป็นอะตอม setadd setadd และ setaddall setaddall เพิ่มวัตถุที่กำหนดไปยังตอนท้ายของฟิลด์อาร์เรย์ setaddunique setaddunique และ setaddallunique setaddallunique เพิ่มเฉพาะวัตถุที่กำหนดซึ่งยังไม่มีอยู่ในฟิลด์อาร์เรย์ไปยังฟิลด์นั้น ตำแหน่งของการแทรกไม่รับประกัน remove remove และ removeall removeall ลบทุกกรณีของวัตถุที่กำหนดออกจากฟิลด์อาร์เรย์ 6 1 ตัวอย่างการใช้ add และ addall liststringfield liststringfield มีค่า รันโค้ดด้านล่าง 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() หลังจากคำสั่งนี้ ผลลัพธ์ของฟิลด์ stringlist จะเป็น 6 2 ตัวอย่างการใช้ addunique และ addallunique liststringfield liststringfield มีค่า รันโค้ดด้านล่าง 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() หลังจากคำสั่งนี้ ผลลัพธ์ของ stringlist stringlist ฟิลด์จะเป็น ไม่มีค่าที่ซ้ำกัน 6 3 ตัวอย่างที่มี removeall liststringfield liststringfield มีค่า รันโค้ดด้านล่าง 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() หลังจากคำสั่งนี้ ผลลัพธ์ของ stringlist stringlist ฟิลด์จะเป็น หมายเหตุ ว่าขณะนี้ไม่สามารถเพิ่มและลบรายการจากอาร์เรย์ในบันทึกเดียวกันได้อย่างอะตอมิก เราจะต้องเรียกบันทึกสำหรับการดำเนินการอาร์เรย์ที่แตกต่างกันแต่ละรายการที่เราต้องการทำแยกกัน 7 ลบฟิลด์เดียวจาก parseobject คุณสามารถลบฟิลด์เดียวจากวัตถุโดยใช้ 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() เสร็จสิ้น! ในจุดนี้ เราได้เรียนรู้ parse data types parse data types บน android android