从CloudKit中的共享数据库读取记录的正确方法是什么

问题描述 投票:0回答:1

我有一个应用程序,可以在其中创建并与其他用户共享记录。当我共享记录并被用户接受时,可以在调用userDidAcceptCloudKitShareWith之后立即显示共享的对象,并使用CKFetchRecordsOperation类来获取对象,这里没有问题。我的问题是,用户接受记录,关闭应用程序,然后再次重新打开应用程序后,尝试直接从Shared Database中读取共享记录。

以下代码成功地从位于名为Private Database的区域中的ListsZone读取了所有记录。

@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来访问记录,如我上面的代码所示。

FYI-我知道共享数据库中有共享记录,因为我可以在CloudKit仪表板中看到它们。

ios swift cloudkit
1个回答
0
投票

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

由于以下两个线程,我找到了答案。

CloudKit Sharing

Unable to fetch records in a sharedCloudDatabase custom Zone using CloudKit

CODE:

@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)")
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.