Как правильно читать записи из общей базы данных в CloudKit? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть приложение, в котором я могу создавать записи и делиться ими с другими пользователями. Когда я делюсь записью и пользователь принимает ее, я могу отобразить общий объект сразу после вызова 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 напрямую, как показано в моем коде выше.

К вашему сведению - я знаю, что в общей базе данных есть общие записи, потому что я вижу их на панели инструментов CloudKit.

1 Ответ

0 голосов
/ 08 мая 2020

Очевидно, что имя вашей CustomZone записи изменяется, когда она добавляется в общую базу данных, поэтому вам сначала нужно извлечь все пользовательские зоны из общей базы данных.

Я нашел ответ благодаря следующим двум темам.

CloudKit Sharing

Невозможно получить записи в пользовательской зоне sharedCloudDatabase с помощью 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)")
        }
    }
}
...