CloudKitコアデータレコードのクエリ

Sep 03 2020

CloudKitを使用してコアデータを保存し、デバイス間で同期できるように移行しようとしているアプリがあります。

同期は正常に機能しています。私が抱えている問題は、アプリがデータベースに初期データを追加することです。これにより、別のデバイスにインストールしたときにデータが複製されます。現在、最初の実行が実行された場合、ユーザーのデフォルトを使用してブール値をローカルに保存しています。これは明らかにデバイスごとにのみ機能します。

データがクラウドにすでに存在するかどうかを確認し、初期データの追加を防ぐ方法はありますか?

Appleのドキュメントは、オブジェクトがすでに存在する場合にその可能性を示唆していますが、最初の起動時にローカルストアにオブジェクトがありません。 https://developer.apple.com/documentation/coredata/mirroring_a_core_data_store_with_cloudkit/reading_cloudkit_records_for_core_data

回答

1 SteveB Sep 04 2020 at 15:00

両方のデバイスが同じCloudKitログインを使用していると仮定すると、確認するデータがユーザーレコードに保存されている場合は、次のようにすることができます。

  1. そのユーザーのCloudKitIDを取得します
func iCloudUserIDAsync(complete: @escaping (_ instance: CKRecord.ID?, _ error: NSError?) -> ()) {
        let container = CKContainer.default()
        container.fetchUserRecordID() {
            recordID, error in
            
            if let error = error {
               //handle
            } else {
                self.userRecordID = recordID
                complete(recordID, nil)
            }
        }
    }
  1. 次に、そのIDを使用してCloudKitにクエリを実行し、ユーザーを元に戻します。
CKContainer.default().publicCloudDatabase.fetch(withRecordID: userRecordID) { (results, error ) in
     if results != nil {
         //got the user record, do what you want with it
     }
     if let error = error {
         //handle error
     }
}

または、データがユーザーレコードにない場合は、CKQueryOperationと述語を使用してクエリを実行することをお勧めします。 https://www.raywenderlich.com/4878052-cloudkit-tutorial-getting-started