如何删除 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 是不是合法?

将已删除的 CKRecord 与 CoreData NSManagedObject 协调一致

在 Cloudkit 中创建 CKRecord?