【问题标题】:Querying Cloud Kit Core Data Record查询Cloud Kit核心数据记录
【发布时间】:2020-09-02 17:56:21
【问题描述】:

我有一个应用程序正在尝试迁移到使用 CloudKit 来存储核心数据,以便它可以跨设备同步。

同步工作正常,我遇到的问题是应用程序向数据库添加了一些初始数据,这导致它在安装到另一台设备上时被复制。目前,如果第一次运行已经执行,我正在使用用户默认值在本地存储布尔值,这显然只适用于每个设备

有什么方法可以查看数据是否已经存在于云端并阻止添加初始数据。

如果对象已经存在但首次启动时本地商店中没有对象,Apple 的文档会建议这样做。 https://developer.apple.com/documentation/coredata/mirroring_a_core_data_store_with_cloudkit/reading_cloudkit_records_for_core_data

【问题讨论】:

  • 如果我在关注这个问题......我通常会做一个 CloudKit 查询来检查数据是否存在,如果存在,设置本地存储,但不要保存数据到 CloudKit,因此您可以避免重复。如果它不存在,那么您可以安全地继续。
  • 如何查询?有很多非核心数据示例,但找不到核心数据示例
  • 也许我现在搞混了:)。但我认为问题在于 CloudKit 查询以查看数据是否在 CloudKit 中 - 或者您是说问题是 CoreData?如果您可以提供更多颜色,我很乐意举个例子。
  • 目前,设备 1 有一个新安装,用于设置应用使用的初始数据。这会同步到 CloudKit。然后设置设备 2,这将进行数据的初始设置,与设备 1 相同,但它也会同步设备 1 已经同步的初始数据。在进行初始设置之前,我正在考虑查询 CloudKit 并查看那里是否有任何数据

标签: swift core-data cloudkit nspersistentcloudkitcontainer


【解决方案1】:

假设两台设备都使用相同的 CloudKit 登录,那么如果您要检查的数据存储在用户记录中,您可以这样做:

  1. 获取该用户的 CloudKit ID
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

【讨论】:

  • 您是否知道使用 NSPersistentCloudKitContainer 执行此操作的任何方法,或者您是否必须直接搜索 CloudKit 记录以查找初始应用程序启动?
  • 恐怕我对 NSPersistentCloudKitContainer 的处理还不够,所以无法对此发表评论。对不起!
  • 没问题!我确实相信这就是 OP @ceriturner 试图使用的东西
猜你喜欢
  • 1970-01-01
  • 2012-06-15
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 2011-03-02
相关资源
最近更新 更多