gpt4 book ai didi

ios - 无法删除设置为 `.parent` 的 CKRecords

转载 作者:行者123 更新时间:2023-12-05 06:25:41 25 4
gpt4 key购买 nike

我正在使用 CloudKit Sharing,但在删除记录时遇到了问题。我创建了两个记录:一个条目和一个 Assets 。如果我设置 .parent Assets 指向条目,然后当我尝试在同一批中删除条目和 Assets 时,它失败并出现引用冲突错误:

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

详情

我创建一个父记录(条目)和一个子记录( Assets ),并设置 Assets 的 .parent到条目:

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)

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

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

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)

我收到上述错误。

解决方法

我意识到我可以先删除 Assets ,然后在它返回时删除条目。但是,我的远程管理代码将很多事情放在一起,我不想重新处理它以确定先做哪些事情,我想尽量减少我需要的远程调用次数。

我还发现,如果我向 Assets 记录添加另一个字段,该字段引用带有 .deleteSelf 的条目行动,这一切都有效。因此,在上面创建 Assets 的代码中,如果我添加以下内容(同时保持 setParent() 调用:

a["entryRef"] = CKRecord.Reference(record: e, action: .deleteSelf)

然后一切正常。

但是,为什么我需要创建另一个我不需要的字段?我认为在一次调用中发送删除会让 CloudKit 正确处理引用,而不需要这个额外的字段。

有没有人遇到过这种情况或找到了一种无需额外引用字段即可解决的方法?使用 CKRecord.References对父级施加了 750 个引用的限制,我宁愿没有这个限制。

最佳答案

我意识到这个问题比较老,但我之前遇到过同样的情况,偶然发现了这个问题,只有经过一些非常的深入观察,我才找到了我认为是的答案值得分享:

CKModifyRecordsOperation(recordsToSave: nil, recordIDsToDelete: [aid, eid])

您应该先提供子项 (aid),而不是在删除数组中先提供父项 (eid)。然后,CloudKit 将在单个批处理中成功处理父子删除。

我有一个类似的情况,我的删除被收集而不考虑层次顺序,所以当这个错误被抛出时,我通过将所有批原子失败操作(即成功删除)保留在顶部来重新排列已删除的记录 ID数组的(保持相同的顺序!),然后将任何引用违规移动到底部。最后,我在循环中重新运行查询,直到一切都得到解决。

如果有多个分层记录乱序,可能需要与 CloudKit 反复来回才能最终将它们组合在一起,但只要保持原子批处理失败的顺序并且每个循环都解决引用违规,它就会最终到达那里。

我已经提交了反馈,但鉴于这个问题已经存在了很长时间,我认为它不会很快得到解决。

关于ios - 无法删除设置为 `.parent` 的 CKRecords,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56796246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com