【发布时间】:2015-02-05 06:00:41
【问题描述】:
所以我想每天擦除特定记录类型的每条记录。所以基本上,我希望在上午 12:00 擦除数据,以便第二天保持新鲜。我该怎么做呢?这是我可以在 CloudKit 仪表板中设置的东西,还是必须以编程方式设置?
【问题讨论】:
所以我想每天擦除特定记录类型的每条记录。所以基本上,我希望在上午 12:00 擦除数据,以便第二天保持新鲜。我该怎么做呢?这是我可以在 CloudKit 仪表板中设置的东西,还是必须以编程方式设置?
【问题讨论】:
如果您需要删除多条记录,则从仪表板中删除记录是一项繁重的工作。
最好的解决方法是创建一个单独的记录类型,该记录类型将包含每天的一条记录。然后在您要删除的那一天的记录中,为该特定日期记录设置一个 CKReference 并将其操作设置为 CKReferenceAction.DeleteSelf
之后,您只需删除当天记录,所有相关记录都将被删除。从仪表板中删除一条记录可以很容易地完成,或者您可以在您的应用程序中创建功能,或者您可以创建第二个应用程序用于管理操作。
【讨论】:
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)
}
【讨论】:
试试这样的:
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
}
})
}
}
}
“记录类型”应该是您的记录类型。希望这会有所帮助。
【讨论】:
这段代码可以删除任意数量的记录
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)
}
}
【讨论】: