【发布时间】:2020-08-19 03:41:05
【问题描述】:
我有一个应用程序,我可以在其中创建记录并与其他用户共享。当我共享一条记录并且用户接受它时,我可以在调用userDidAcceptCloudKitShareWith 并使用CKFetchRecordsOperation 类获取对象后立即显示共享对象,这里没有问题。我的问题是在用户接受记录、关闭应用程序并再次重新打开应用程序后,尝试直接从Shared Database 读取共享记录。
以下代码成功地从位于名为ListsZone 的区域中的Private Database 中读取所有记录。
@IBAction func sharedRecords(_ sender: Any) {
let privateDatabase = CKContainer.init(identifier: "iCloud.com.mySite.lists").database(with: .private)
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "Items", predicate: predicate)
let ckRecordZoneID = CKRecordZone(zoneName: "ListsZone")
let ckRecordID = CKRecord.ID(zoneID: ckRecordZoneID.zoneID)
privateDatabase.perform(query, inZoneWith:ckRecordID.zoneID){( results , error) in
guard error == nil else{
print("Error \(String(describing: error?.localizedDescription))")
return
}
if let itemsFromResults = results{
print("Items: \(itemsFromResults)")
}
}
}
我期望能够使用上面相同的代码从Shared Database 读取共享记录,除了修改下面的行,但它不起作用。
let privateDatabase = CKContainer.init(identifier: "iCloud.com.mySite.lists").database(with: .shared)
我收到以下错误。
“共享数据库中只能访问共享区域”
我错过了什么?
从Shared Database 读取记录的正确方法是什么?
我的印象是,已经接受用户共享记录并且记录保存在Shared Database中的用户可以通过直接要求Shared Database来访问记录,如我上面的代码所示。
仅供参考 - 我知道共享数据库中有共享记录,因为我可以在 CloudKit 仪表板中看到它们。
【问题讨论】:
-
您的区域“ListsZone”是否共享?它看起来不像。 db 和 zone 都必须共享。
-
@johnelemans 我是否需要将其设为共享区域,如何?我没有看到并选择将其设为共享区域。我的印象是所有自定义区域都是默认共享的,因为这是能够共享项目的唯一方式
-
巧合的是,我现在才刚学这个。当我知道更多时,我会发布!
-
请告诉我你发现了什么。
-
答案是以下两个线程。显然,您的 CustomZone 记录的名称在添加到共享数据库时会发生变化,因此,您首先需要从共享数据库中检索所有自定义区域。 stackoverflow.com/questions/40603657/cloudkit-sharing | stackoverflow.com/questions/56163096/…