如何删除 CKRecord 和 CloudKit 中的所有引用记录
Posted
技术标签:
【中文标题】如何删除 CKRecord 和 CloudKit 中的所有引用记录【英文标题】:How to delete CKRecord and all references records in CloudKit 【发布时间】:2018-03-24 17:27:03 【问题描述】:我想删除父 CKRecord
和这条记录的所有子。
创建父记录和子记录的方法如下:
func save()
//Creating parent record
let parentRecord = CKRecord(recordType: "ParentRecord")
parentRecord["name"] = "BOO" as CKRecordValue
//Creating child record
let childRecord = CKRecord(recordType: "ChildRecord")
childRecord["name"] = "FOO" as CKRecordValue
let reference = CKReference(record: childRecord, action: CKReferenceAction.deleteSelf)
//ADDING Reference to parent record
parentRecord["referenceObject"] = reference as CKRecordValue
let operation = CKModifyRecordsOperation(recordsToSave: [parentRecord, childRecord], recordIDsToDelete: nil)
//([CKRecord]?, [CKRecordID]?, Error?) -> Void)
operation.modifyRecordsCompletionBlock = records, recordIDs, error in
if error != nil
print(error.debugDescription)
operation.queuePriority = .high
operation.qualityOfService = .background
let operationQueue = OperationQueue()
operationQueue.addOperations([operation], waitUntilFinished: false)
现在我只想通过代码删除父记录。由于CKReferenceAction.deleteSelf
,应自动删除子记录。
“删除”函数如下所示:
func delete(recordName: String)
let privateDB = CKContainer.default().privateCloudDatabase
let recordID = CKRecordID(recordName: recordName)
privateDB.delete(withRecordID: recordID) (id, error) in
if error != nil
print(error.debugDescription)
当我使用 delete
方法时,我的 父 记录正在从 CloudKit
数据库中删除,但子记录仍然存在,我不知道为什么。有什么建议吗?
【问题讨论】:
【参考方案1】:解决方案
如果我们想删除子记录,我们必须将parent record
的引用添加到child record
。在上述情况下,它应该如下所示:
let privateDB = CKContainer.default().privateCloudDatabase
let parentRecord = CKRecord(recordType: "ParentRecord")
parentRecord["name"] = "FOO" as CKRecordValue
let childRecord = CKRecord(recordType: "ChildRecord")
childRecord["name"] = "BOO" as CKRecordValue
privateDB.save(parentRecord) (record: CKRecord?, error: Error?) in
if error == nil
if let responseRecord = record
let reference = CKReference(record: responseRecord, action: CKReferenceAction.deleteSelf)
childRecord["referenceObject"] = reference as CKRecordValue
privateDB.save(childRecord, completionHandler: (record, error) in
// DO SOMETHIG
)
在这种情况下,删除parent record
会自动删除子记录
【讨论】:
我找不到你在哪里设置 childRecord.parent,你能解释一下吗?设置这个属性(也允许自动共享子记录)会让我们自动删除它们吗?我知道当我设置父属性时,引用会自动添加。以上是关于如何删除 CKRecord 和 CloudKit 中的所有引用记录的主要内容,如果未能解决你的问题,请参考以下文章
无法从 CloudKit 通知信息和用户信息结构中获取 CKRecord.ID
如果由于网络连接不良而尚未完成创建,如何删除CKRecord?
为啥我无法访问 CloudKit 中 CKRecord 的 createdAt 字段?
在 Cloudkit 中更改 CKRecord 的 CKRecordID 是不是合法?