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

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

【问题讨论】:

    标签: ios swift 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 个条目,这将需要更长的时间!你应该像这样使用批量删除:stackoverflow.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)
          }
       }
      

      【讨论】:

        猜你喜欢
        • 2015-04-08
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-15
        • 2016-06-21
        • 1970-01-01
        • 2019-06-03
        相关资源
        最近更新 更多