【问题标题】:How to delete CKRecord and all references records in CloudKit如何删除 CKRecord 和 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 数据库中删除,但子记录仍然存在,我不知道为什么。有什么建议吗?

【问题讨论】:

    标签: swift database cloud 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,你能解释一下吗?设置这个属性(也允许自动共享子记录)会让我们自动删除它们吗?我知道当我设置父属性时,引用会自动添加。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多