无法删除已设置`.parent`的CKRecords

时间:2019-06-27 17:43:34

标签: ios cloudkit

我正在使用CloudKit共享,删除记录时遇到问题。我创建两个记录:一个条目和一个资产。如果我将资产的{​​{1}}设置为指向条目,那么当我尝试同时删除条目和资产时,它会失败并出现引用冲突错误:

.parent

详细信息

我创建一个父记录(条目)和一个子记录(资产),并将资产的{​​{1}}设置为条目:

<CKError 0x600002ac2190: \"Reference Violation\" (31/2025); server message = \"Record delete would violate validating reference ([a1]), rejecting update\"

然后我将两者保存在同一通话中

.parent

操作成功完成,并且在CloudKit中正确创建了记录。

但是,当我尝试同时删除这两者时:

let eid = CKRecord.ID(recordName: "e1", zoneID: CKRecordZone.ID(zoneName: "test", ownerName: CKCurrentUserDefaultName))
let e = CKRecord(recordType: "Entry", recordID: eid)
e["title"] = "Entry"

let aid = CKRecord.ID(recordName: "a1", zoneID: CKRecordZone.ID(zoneName: "test", ownerName: CKCurrentUserDefaultName))
let a = CKRecord(recordType: "Asset", recordID: aid)
a["position"] = 1
a.setParent(e)

我收到上述错误。

环游

我意识到我可以先删除资产,然后返回该资产,然后删除条目。但是,我的远程管理代码将许多事情分批处理,并且我不想对其进行重新处理以弄清首先要执行的事情,并且希望将所需的远程调用的数量减至最少。

我还发现,如果我在资产记录中添加另一个字段,该字段通过let op = CKModifyRecordsOperation(recordsToSave: [e,a], recordIDsToDelete: nil) op.modifyRecordsCompletionBlock = { (records, recordIDs, error) in print("Returned from modify") print("records: \(records)") print("error: \(error)") } CKContainer.default().privateCloudDatabase.add(op) 动作引用了该条目,那么这一切都可以。因此,在上面创建资产的代码中,如果添加以下内容(同时保持let op = CKModifyRecordsOperation(recordsToSave: nil, recordIDsToDelete: [eid, aid]) op.modifyRecordsCompletionBlock = { (records, recordIDs, error) in print("Returned from modify") print("records: \(records)") print("deleted: \(recordIDs)") print("error: \(error)") } CKContainer.default().privateCloudDatabase.add(op) 调用:

.deleteSelf

然后一切正常。

但是,为什么我需要创建另一个我不需要的字段?我认为,只需一次调用发送删除内容,即可让CloudKit正确处理引用,而无需此额外字段。

有人有没有经历过这种情况或找到了一种无需额外参考字段就能解决的方法?使用setParent()对父项施加了750个引用限制,我宁愿没有该限制。

0 个答案:

没有答案