首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CloudKit --尽管delete工作,但未能用我自己的CKRecord.ID修改现有的CKRecord

CloudKit --尽管delete工作,但未能用我自己的CKRecord.ID修改现有的CKRecord
EN

Stack Overflow用户
提问于 2021-09-28 07:48:09
回答 1查看 185关注 0票数 0

对于我保存到CloudKit的每一条记录,我都会传入一个使用自己的UUID创建的CKRecord.ID,如下所示:

代码语言:javascript
复制
        let recordId = CKRecord.ID(recordName: myOwnUUID, zoneID: .default)
        let record = CKRecord(recordType: recordType, recordID: recordId)
        record.setValue(title, forKey: "title")
        ...

UUID是我的数据模型的一部分,不会对每个记录进行更改。

我能够成功地删除记录,再次传入相同的CKRecord.ID:

代码语言:javascript
复制
    func delete(_ item: MyItem, completion: @escaping (Result<Int, Error>) -> ()) {

        let myOwnUUID = item.id // this is the exact same UUID that I used to create/save the record the first time.
        let recordId = CKRecord.ID(recordName: myOwnUUID, zoneID: .default)

        ckDatabase.delete(withRecordID: recordId) { (recordId, error) in
            DispatchQueue.main.async {
                if let error = error {
                    completion(.failure(error))
                    return
                }
                guard recordId != nil else {
                    completion(.failure(CloudKitHelperError.castFailure))
                    return
                }
                completion(.success(0))
            }
        }
    }

所以,删除工作没有任何问题。

但是当我尝试修改记录时,我得到了错误:"Server Record Changed". "record to insert already exists"

}>

下面是我的修改代码:

代码语言:javascript
复制
    func modify(_ item: MyItem, completion: @escaping (Result<Int, Error>) -> ()) {

        let myOwnUUID = item.id // this is the exact same UUID that I used to create/save the record the first time.
        let recordId = CKRecord.ID(recordName: myOwnUUID, zoneID: .default)

        let record = CKRecord(recordType: recordType, recordID: recordId)
        
        record.setObject(item.title as __CKRecordObjCValue, forKey: "title")

        let configuration = CKOperation.Configuration()
        configuration.timeoutIntervalForRequest = 10
        configuration.timeoutIntervalForResource = 10

        let operation = CKModifyRecordsOperation(recordsToSave: [record], recordIDsToDelete: nil)
        operation.configuration = configuration
        
        operation.modifyRecordsCompletionBlock = { (savedRecords, _, error) in
            DispatchQueue.main.async {
                if savedRecords != nil, error == nil {
                    completion(.success(0))
                }
                if let error = error {
                    completion(.failure(error))
                }
            }
        }
        
        ckDatabase.add(operation)
    }

顺便说一下,ckDatabase设置为:ckDatabase = CKContainer(identifier: "iCloud.com.xxx.yyy").privateCloudDatabase

那么,为什么我不能使用我用来创建记录的CKRecord.ID来修改现有的记录呢?删除操作清楚地识别了它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-28 08:18:44

通常,您应该始终从后端获取CKRecord对象,而不是在内存中构造它。只有这样,cloudkit才会正确地初始化它。

首先给出这个记录的代码在哪里,而不是下面的代码?

代码语言:javascript
复制
let record = CKRecord(recordType: recordType, recordID: recordId)

可选地,检查记录保存策略

见这个答案为您提供详细信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69357703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档