每天从特定记录类型中删除所有记录 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 容器的所有用户 iCloud 记录
CloudKit:删除记录的 CKQueryOperation