iOS
...
Data Objects
การสร้างคำสั่งสอบถามข้อมูลใน ParseSwift SDK สำหรับ iOS
14 นาที
คำถามพื้นฐาน บทนำ ในกรณีการใช้งานส่วนใหญ่ เราต้องการดึงข้อมูลจากฐานข้อมูลโดยมีเงื่อนไขบางประการ เงื่อนไขเหล่านี้อาจรวมถึงการเปรียบเทียบที่ซับซ้อนและความต้องการในการจัดเรียง ดังนั้น ในแอปพลิเคชันใด ๆ การสร้างคำถามที่มีประสิทธิภาพจึงเป็นสิ่งพื้นฐาน และในขณะเดียวกัน ฐานข้อมูลต้องสามารถดำเนินการได้อย่างรวดเร็วที่สุดเท่าที่จะเป็นไปได้ sdk parseswift sdk parseswift sdk มีเครื่องมือที่จำเป็นสำหรับคุณในการสร้างคำถามใด ๆ ตามความต้องการของแอปพลิเคชัน ในบทเรียนนี้ เราจะสำรวจเครื่องมือเหล่านี้และใช้มันในแอปพลิเคชันจริง บทเรียนนี้ใช้แอปพื้นฐานที่สร้างขึ้นใน xcode 12 และ ios 14 ในทุกเวลา คุณสามารถเข้าถึงโครงการทั้งหมดได้ผ่านที่เก็บ github ของเรา ที่เก็บตัวอย่าง ios เป้าหมาย เพื่อเข้าใจวิธีการสร้างคำถามพื้นฐานเพื่อดึงข้อมูลจากฐานข้อมูล back4app ข้อกำหนดเบื้องต้น ในการทำให้การเริ่มต้นนี้เสร็จสมบูรณ์ คุณต้องการ xcode แอปที่สร้างขึ้นที่ back4app ติดตาม บทแนะนำการสร้างแอป parse ใหม่ เพื่อเรียนรู้วิธีการสร้างแอป parse ที่ back4app หมายเหตุ ติดตาม บทแนะนำการติดตั้ง parse sdk (swift) เพื่อสร้างโปรเจกต์ xcode ที่เชื่อมต่อกับ back4app การเข้าใจแอป contacts ของเรา เทมเพลตโปรเจกต์คือแอป contacts ที่ผู้ใช้เพิ่มข้อมูลของผู้ติดต่อเพื่อบันทึกไว้ในฐานข้อมูล back4app ในหน้าหลักของแอป คุณจะพบชุดปุ่มสำหรับประเภทคำถามต่างๆ โดยใช้ปุ่ม + + ที่ตั้งอยู่ด้านขวาบนของแถบการนำทาง เราสามารถเพิ่ม ผู้ติดต่อ ผู้ติดต่อ ได้ตามต้องการ การอ้างอิงอย่างรวดเร็วของคำสั่งที่เราจะใช้ สำหรับตัวอย่างนี้ เราจะใช้วัตถุ ผู้ติดต่อ ผู้ติดต่อ 1 import foundation 2 import parseswift 3 4 struct contact parseobject { 5 // required properties from parseobject protocol 6 var originaldata data? 7 var objectid string? 8 var createdat date? 9 var updatedat date? 10 var acl parseacl? 11 12 // custom fields for the contact's information 13 var name string? 14 var birthday date? 15 var numberoffriends int? 16 var favoritefoods \[string]? 17 18 19 } วิธีการต่อไปนี้จะช่วยให้เราสามารถบันทึกและค้นหา contact contact วัตถุ create contact //when creating and saving a new instance of contact we can use 1 var newcontact contact = contact(name "john doe", birthday date(), numberoffriends 5, favoritefoods \["bread", "pizza"]) 2 3 // saves newcontact on your back4app database synchronously and returns the new saved item it throws and error if something went wrong 4 let savedcontact = try? newcontact save() 5 6 // saves newcontact on your back4app database asynchronously, and passes a result\<contact, parseerror> object to the completion block to handle the save process 7 newcontact save { result in 8 // handle the result to check wether the save process was successfull or not 9 } query all //for retrieving all the contact items saved on a back4app database, we construct a query\<contact> object and call the find() method on it 1 let contactsquery = contact query() // a query to fetch all contact items on your back4app database 2 3 // fetches the items synchronously or throws an error if found 4 let fetchedcontacts = try? query find() 5 6 // fetches the items asynchronously and calls a completion block passing a result object containing the result of the operation 7 query find { result in 8 // handle the result 9 } query by name //in order to create a query with a specific condition, we use the static method query( ) provided by the parseobject protocol we pass a queryconstraint object to the method as a parameter this queryconstraint object represents the type of constraint we are imposing on the query for queries involving comparison constraints, the parseswift sdk provides the following methods to create them 1 import parseswift 2 3 // a constraint to retreive all contact items that have exactly the string 'jhon doe' in their 'name' field 4 let constraint1 = try? equalto(key "name", value "john doe") 5 6 // an operator like implementation for the equalto(key\ value ) method 7 let constraint2 queryconstraint = "name" == "jhon doe" 8 9 // a constraint to retrieve all contact items that have the string 'john' in their 'name' field (only workd with string type fields) 10 let constraint3 queryconstraint = containsstring(key "name", substring "jhon") 11 12 let query = contact query(constrint1) // depending on your use case, you can send any of the above constraints as parameter 13 14 // executes the query synchronously it throws an error if something happened 15 let fetchedcontacts = try? query find() 16 17 // executes que query asynchronously and returns a result<\[contact], parseerror> object with the result 18 query find() { result in 19 // handle the result 20 } query by friend count //when we want to query contacts which have a certain amount of friends or more, we do it in the following way 1 import parseswift 2 3 // a constraint to retrieve all contact items that have 30 or more number of friends 4 let constraint1 queryconstraint = "numberoffriends" >= 30 5 6 // a constraint to retrieve all contact items that have more than 30 number of friends 7 let constraint2 queryconstraint = "numberoffriends" > 30 8 9 let query = contact query(constraint1) // depending on your use case, you can send any of the above constraints as parameter 10 11 // executes the query synchronously it throws an error if something happened 12 let fetchedcontacts = try? query find() 13 14 // executes que query asynchronously and returns a result<\[contact], parseerror> object with the result 15 query find() { result in 16 // handle the result 17 } query with ordering //adding an ordering option to queries is straightforward any query\<contact> object has the order( ) method to do so a simple query using the birthday as descending order can be implemented in the folowing way 1 import parseswift 2 3 // a query without order to retrieve all the contact items 4 let unorderedquery = contact query() 5 6 // sorts the result by the brithday field the parameter in the enumeration is the key of the field used to order the results 7 let descendingorder = query\<contact> order descending("birthday") 8 9 let orderedquery = unorderedquery order(\[descendingorder]) // returns a new query with the requested (descending) ordering option 10 11 // executes the query synchronously it throws an error if something happened 12 let orderedcontacts = try? orderedquery find() 13 14 // executes que query asynchronously and returns a result<\[contact], parseerror> object with the result 15 orderedcontacts find() { result in 16 // handle the result 17 } 1 ดาวน์โหลดเทมเพลตแอปติดต่อ โครงการ xcode xcode มีโครงสร้างดังต่อไปนี้ ในทุกช่วงเวลา คุณสามารถเข้าถึงโครงการทั้งหมดได้ผ่านทาง github ของเรา ที่เก็บตัวอย่าง ios เพื่อมุ่งเน้นไปที่วัตถุประสงค์หลักของคู่มือนี้ เราจะอธิบายเฉพาะส่วนที่เกี่ยวข้องกับการสอบถามและ parseswift sdk เท่านั้น 2 กระบวนการ crud เพิ่มเติม ก่อนเริ่มต้นกับคำถาม จำเป็นต้องมีการติดต่อบางอย่างที่บันทึกไว้ในฐานข้อมูล back4app ของคุณแล้ว ในคลาส newcontactcontroller newcontactcontroller เราได้ดำเนินการสร้างแบบฟอร์มพื้นฐานเพื่อเพิ่ม contact contact เพื่อบันทึกอินสแตนซ์ของ contact contact อ็อบเจ็กต์ เราใช้ handleaddcontact() handleaddcontact() เมธอดที่ดำเนินการในคลาส newcontactcontroller newcontactcontroller 1 // newcontactcontroller swift file 2 3 4 extension newcontactcontroller { 5 /// retrieves the info the user entered for a new contact and stores it on your back4app database 6 @objc fileprivate func handleaddcontact() { 7 view\ endediting(true) 8 9 // collect the contact's information from the form 10 guard let name = nametextfield text, 11 let numberoffriendsstring = numberoffriendstextfield text, 12 let numberoffriends = int(numberoffriendsstring), 13 let favoritefoods = favoritefoodstextfield text? split(separator ",") else { 14 return showalert(title "error", message "the data you entered is con valid ") 15 } 16 17 // once the contact's information is collected, instantiate a contact object to save it on your back4app database 18 let contact = contact( 19 name name, 20 birthday birthdaydatepicker date, 21 numberoffriends numberoffriends, 22 favoritefoods favoritefoods compactmap { string($0) trimmingcharacters(in whitespaces) } 23 ) 24 25 // save the new contact 26 contact save { \[weak self] result in 27 switch result { 28 case success( ) 29 self? showalert(title "success", message "contact saved ") { 30 self? dismiss(animated true, completion nil) 31 } 32 case failure(let error) 33 self? showalert(title "error", message "failed to save contact \\(error message)") 34 } 35 } 36 } 37 } สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับขั้นตอนนี้ คุณสามารถไปที่ คู่มือการดำเนินการพื้นฐาน 3 การดำเนินการค้นหาพื้นฐาน \ โดยชื่อ ตัวอย่างแรกที่เราจะดูคือการค้นหาที่อนุญาตให้เราดึงข้อมูลติดต่อที่มีส่วนย่อยเฉพาะใน ชื่อ ชื่อ ฟิลด์ ในการทำเช่นนี้ เราจะสร้าง queryconstraint queryconstraint วัตถุ วัตถุนี้จะมีข้อจำกัดที่เราต้องการ parseswift sdk parseswift sdk มีวิธีการต่อไปนี้เพื่อ (โดยอ้อม) สร้าง queryconstraint queryconstraint 1 // queryconstraint swift file 2 3 / 4 add a constraint for finding string values that contain a provided substring 5 warning this will be slow for large datasets 6 parameter key the key that the string to match is stored in 7 parameter substring the substring that the value must contain 8 parameter modifiers any of the following supported pcre modifiers (defaults to nil) 9 `i` case insensitive search 10 `m` search across multiple lines of input 11 returns the resulting `queryconstraint` 12 / 13 public func containsstring(key string, substring string, modifiers string? = nil) > queryconstraint 14 15 / 16 add a constraint that requires that a key is equal to a value 17 parameter key the key that the value is stored in 18 parameter value the value to compare 19 returns the same instance of `queryconstraint` as the receiver 20 warning see `equalto` for more information 21 behavior changes based on `parseswift configuration isusingequalqueryconstraint` 22 where isusingequalqueryconstraint == true is known not to work for livequery on 23 parse servers <= 5 0 0 24 / 25 public func == \<t>(key string, value t) > queryconstraint where t encodable ตัวอย่างเช่น คำถามที่อนุญาตให้เราดึงข้อมูลทั้งหมดของ contact contact ที่มี john ใน ชื่อ ชื่อ ฟิลด์สามารถสร้างได้ด้วย 1 // create the query sending the constraint as parameter 2 let constraint queryconstraint = containsstring(key "name", substring "john") // the first parameter (key) referres to the name of the field 3 let query = contact query(constrain) 4 5 // retrieve the contacts asynchronously (or sinchronously if needed) 6 query find() { result in 7 // handle the result and do the corresponding ui update 8 } ในกรณีที่ข้อกำหนดต้องการให้ ชื่อ ชื่อ ฟิลด์ต้องตรงกับข้อความที่กำหนด เราสามารถใช้ 1 // create the query sending the constraint as parameter 2 let value = "john" 3 let constraint queryconstraint = "name" == value 4 let query = contact query(constrain) \ โดยจำนวนเพื่อน คำถามที่มีข้อจำกัดเกี่ยวกับการเปรียบเทียบเชิงตัวเลขสามารถสร้างได้โดยการสร้าง queryconstraint queryconstraint ด้วย 1 / 2 add a constraint that requires that a key is greater than a value 3 parameter key the key that the value is stored in 4 parameter value the value to compare 5 returns the same instance of `queryconstraint` as the receiver 6 / 7 public func > \<t>(key string, value t) > queryconstraint where t encodable 8 9 / 10 add a constraint that requires that a key is greater than or equal to a value 11 parameter key the key that the value is stored in 12 parameter value the value to compare 13 returns the same instance of `queryconstraint` as the receiver 14 / 15 public func >= \<t>(key string, value t) > queryconstraint where t encodable 16 17 / 18 add a constraint that requires that a key is less than a value 19 parameter key the key that the value is stored in 20 parameter value the value to compare 21 returns the same instance of `queryconstraint` as the receiver 22 / 23 public func < \<t>(key string, value t) > queryconstraint where t encodable 24 25 / 26 add a constraint that requires that a key is less than or equal to a value 27 parameter key the key that the value is stored in 28 parameter value the value to compare 29 returns the same instance of `queryconstraint` as the receiver 30 / 31 public func <= \<t>(key string, value t) > queryconstraint where t encodable เพื่อค้นหาทุกคนที่มีเพื่อน 30 คนขึ้นไป เราใช้ 1 let query = contacts query("numberoffriends" >= 30) 2 3 // retrieve the contacts asynchronously (or sinchronously if needed) 4 query find() { result in 5 // handle the result and do the corresponding ui update 6 } \ การจัดเรียงผลลัพธ์ของคำถาม สำหรับการจัดเรียงผลลัพธ์จากคำถาม อ็อบเจ็กต์ query\<contacts> query\<contacts> ให้วิธีการ order( ) order( ) ซึ่งจะคืนค่าอ็อบเจ็กต์ใหม่ query\<contact> query\<contact> โดยพิจารณาตัวเลือกการจัดเรียงที่ร้องขอ ในฐานะพารามิเตอร์ เราจะส่งการจำแนกประเภท ( query\<contact> order query\<contact> order ) เพื่อระบุการจัดเรียงที่เราต้องการ โค้ดตัวอย่างต่อไปนี้ใช้การจัดเรียงแบบลดหลั่นตาม birthday birthday ฟิลด์ 1 // a query without order to retrieve all the contact items 2 let unorderedquery = contact query() 3 4 // sorts the contacts based on their brithday the parameter in the enumeration is the key of the field used to order the results 5 let descendingorder = query\<contact> order descending("birthday") 6 7 let orderedquery = unorderedquery order(\[descendingorder]) // returns a new query with the requested (descending) ordering option 8 9 // executes que query asynchronously and returns a result<\[contact], parseerror> object with the result 10 orderedcontacts find() { result in 11 // handle the result 12 } ใน ตัวอย่างโปรเจกต์ https //github com/templates back4app/ios basic queries example , เราได้ดำเนินการตามคำค้นหาที่กล่าวถึงข้างต้น คลาส contactscontroller contactscontroller มีวิธีการ fetchcontacts() fetchcontacts() ซึ่งคุณจะพบโค้ดส่วนนี้ 1 2 3 class contactscontroller { 4 let querytype querytype 5 6 7 8 private func fetchcontacts() { 9 // we create a query\<contact> according to the querytype enumeration 10 let query query\<contact> = { 11 switch querytype { 12 case byname(let value) 13 return contact query(containsstring(key "name", substring value)) 14 case bynumberoffriends(let quantity) 15 return contact query("numberoffriends" >= quantity) 16 case byordering(let order) 17 let query = contact query() 18 switch order { 19 case ascending return query order(\[ ascending("birthday")]) 20 case descending return query order(\[ descending("birthday")]) 21 } 22 case all 23 return contact query() 24 } 25 }() 26 27 // execute the query 28 query find { \[weak self] result in 29 switch result { 30 case success(let contacts) 31 self? contacts = contacts 32 33 // update the ui 34 dispatchqueue main async { self? tableview\ reloaddata() } 35 case failure(let error) 36 // notify the user about the error that happened during the fetching process 37 self? showalert(title "error", message "failed to retrieve contacts \\(error message)") 38 return 39 } 40 } 41 } 42 } 4 รันแอป! ก่อนกดปุ่มรันบน xcode xcode , อย่าลืมตั้งค่าการใช้งาน back4app back4app ใน appdelegate appdelegate คลาส! ใช้ปุ่ม + + ในแถบการนำทาง เพื่อเพิ่มรายชื่อผู้ติดต่อและทดสอบการค้นหาที่แตกต่างกัน