iOS
...
Data Objects
ParseSwift SDKでBack4Appデータベースのデータをクエリする方法
14 分
基本クエリ イントロダクション ほとんどのユースケースでは、特定の条件でデータベースからデータを取得する必要があります。これらの条件には、複雑な比較や並べ替えの要件が含まれる場合があります。したがって、アプリケーションにおいては、効率的なクエリを構築することが基本であり、同時にデータベースはそれらをできるだけ早く実行できる必要があります。 「 parseswift sdk parseswift sdk 」は、アプリケーションの要件に応じて任意のクエリを構築するために必要なツールを提供します。このチュートリアルでは、これらのツールを探求し、実際のアプリケーションで使用します。 このチュートリアルでは、xcode 12で作成された基本的なアプリと ios 14 を使用します。 いつでも、私たちのgithubリポジトリを通じて完全なプロジェクトにアクセスできます。 iosのサンプルリポジトリ 目標 back4appデータベースからデータを取得するための基本的なクエリを作成する方法を理解すること。 前提条件 このクイックスタートを完了するには、次のものが必要です: xcode。 back4appで作成されたアプリ。 新しいparseアプリのチュートリアル をフォローして、back4appでparseアプリを作成する方法を学びます。 注意: parse sdk(swift)インストールチュートリアル をフォローして、back4appに接続されたxcodeプロジェクトを作成します。 私たちの連絡先アプリを理解する プロジェクトテンプレートは、ユーザーが連絡先の情報を追加して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 たとえば、すべての 連絡先 連絡先 を取得するクエリは、 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 クラスで設定するのを忘れないでください! ナビゲーションバーの + + ボタンを使用して、いくつかの連絡先を追加し、さまざまなクエリをテストしてください。