每天从特定记录类型中删除所有记录 CloudKit

Posted

技术标签:

【中文标题】每天从特定记录类型中删除所有记录 CloudKit【英文标题】:Deleting all records CloudKit every day from a particular record type 【发布时间】:2015-02-05 06:00:41 【问题描述】:

所以我想每天擦除特定记录类型的每条记录。所以基本上,我希望在上午 12:00 擦除数据,以便第二天保持新鲜。我该怎么做呢?这是我可以在 CloudKit 仪表板中设置的东西,还是必须以编程方式设置?

【问题讨论】:

【参考方案1】:

如果您需要删除多条记录,则从仪表板中删除记录是一项繁重的工作。

最好的解决方法是创建一个单独的记录类型,该记录类型将包含每天的一条记录。然后在您要删除的那一天的记录中,为该特定日期记录设置一个 CKReference 并将其操作设置为 CKReferenceAction.DeleteSelf

之后,您只需删除当天记录,所有相关记录都将被删除。从仪表板中删除一条记录可以很容易地完成,或者您可以在您的应用程序中创建功能,或者您可以创建第二个应用程序用于管理操作。

【讨论】:

【参考方案2】:
func deleteAllRecords()

    let publicDatabase: CKDatabase = CKContainer.defaultContainer().publicCloudDatabase

    // fetch records from iCloud, get their recordID and then delete them
    var recordIDsArray: [CKRecordID] = []

    let operation = CKModifyRecordsOperation(recordsToSave: nil, recordIDsToDelete: recordIDsArray)
    operation.modifyRecordsCompletionBlock = 
        (savedRecords: [CKRecord]?, deletedRecordIDs: [CKRecordID]?, error: NSError?) in
        print("deleted all records")
    
    
    publicDatabase.add(operation)

【讨论】:

这样操作是不是有一个批次可以删除多少条记录的限制? 由于某种原因,这对我不起作用。当我稍后从数据库中取出时,所有应该被删除的记录都还在。【参考方案3】:

试试这样的:

let publicDb = CKContainer.defaultContainer().publicCloudDatabase

let query = CKQuery(recordType: "RECORD TYPE", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil))
publicDb.performQuery(query, inZoneWithID: nil)  (records, error) in

    if error == nil 

        for record in records! 

            publicDb.deleteRecordWithID(record.recordID, completionHandler:  (recordId, error) in

                if error == nil 

                    //Record deleted

                

            )

        

    


“记录类型”应该是您的记录类型。希望这会有所帮助。

【讨论】:

由于 for 循环,这要慢得多,如果您有超过 3-5 个条目,这将需要更长的时间!你应该像这样使用批量删除:***.com/a/36414506/530884 那个循环一个接一个地开始几个异步操作!你愿意有多少并发连接?我会以某种方式对其进行序列化。【参考方案4】:

这段代码可以删除任意数量的记录

import CloudKit

class iCloudDelete 

    private let cloudDB: CKDatabase
    private var recordIDsToDelete = [CKRecordID]()
    private var onAllQueriesCompleted : (()->())?

    public var resultsLimit = 10 // default is 100

    init(cloudDB: CKDatabase)
        self.cloudDB = cloudDB
    

    func delete(query: CKQuery, onComplete: @escaping ()->Void) 
        onAllQueriesCompleted = onComplete
        add(queryOperation: CKQueryOperation(query: query))
    

    private func add(queryOperation: CKQueryOperation) 
        queryOperation.resultsLimit = resultsLimit
        queryOperation.queryCompletionBlock = queryDeleteCompletionBlock
        queryOperation.recordFetchedBlock = recordFetched
        cloudDB.add(queryOperation)
    

    private func queryDeleteCompletionBlock(cursor: CKQueryCursor?, error: Error?) 
        print("-----------------------")
        delete(ids: recordIDsToDelete) 
            self.recordIDsToDelete.removeAll()

            if let cursor = cursor 
                self.add(queryOperation: CKQueryOperation(cursor: cursor))
             else 
                self.onAllQueriesCompleted?()
            
        
    

    private func recordFetched(record: CKRecord) 
        print("RECORD fetched: \(record.recordID.recordName)")
        recordIDsToDelete.append(record.recordID)
    

    private func delete(ids: [CKRecordID], onComplete: @escaping ()->Void) 
        let delete = CKModifyRecordsOperation(recordsToSave: nil, recordIDsToDelete: ids)
        delete.completionBlock = 
            onComplete()
        
        cloudDB.add(delete)
    
 

【讨论】:

以上是关于每天从特定记录类型中删除所有记录 CloudKit的主要内容,如果未能解决你的问题,请参考以下文章

Cloudkit 返回具有特定字符串的记录

清除/清除 CloudKit 容器的所有用户 iCloud 记录

如何从 CloudKit 更新所有客户端记录?

CloudKit:删除记录的 CKQueryOperation

如何删除 CKRecord 和 CloudKit 中的所有引用记录

为啥CKModifyRecordsOperation批量删除CloudKit中的记录不删除记录?