【问题标题】:What is the proper way to read records from a Shared Database in CloudKit从 CloudKit 中的共享数据库读取记录的正确方法是什么
【发布时间】: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/…

标签: ios swift cloudkit


【解决方案1】:

显然,CustomZone 记录的名称在添加到共享数据库时会发生变化,因此,您首先需要从共享数据库中检索所有自定义区域。

感谢以下两个线程,我找到了答案。

CloudKit Sharing

Unable to fetch records in a sharedCloudDatabase custom Zone using CloudKit

代码:

@IBAction func readSharedRecords(_ sender: Any) {
    
    let sharedData = CKContainer.default().sharedCloudDatabase
    sharedData.fetchAllRecordZones { (recordZone, error) in
        if error != nil {
            print(error?.localizedDescription ?? "Error")
        }
        if let recordZones = recordZone {
            for i in 0..<recordZones.count{
                // find the zone you want to query
                if recordZones[i].zoneID.zoneName == "ListsZone"{
                    self.sharedRecords(zID: recordZones[i].zoneID)
                }
            }
        }
    }
}

func sharedRecords(zID: CKRecordZone.ID){
    let privateDatabase = CKContainer.init(identifier: "iCloud.com.mySite.lists").database(with: .shared)

    let predicate = NSPredicate(value: true)
    let query = CKQuery(recordType: "Items", predicate: predicate)

    privateDatabase.perform(query, inZoneWith: zID){( results , error) in
        guard error == nil else{
            print("Error: \(String(describing: error?.localizedDescription))")
            return
        }
        if let itemsFromResults = results{
            print("Items: \(itemsFromResults)")
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2021-07-29
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    相关资源
    最近更新 更多