Удаление всех записей CloudKit каждый день из записи определенного типа

Поэтому я хочу стирать каждую запись для определенного типа записи каждый день. В общем, я хочу, чтобы данные были стерты в 00:00, чтобы они были свежими на следующий день. Как мне это сделать? Это то, что я могу настроить на панели управления CloudKit, или мне придется настраивать это программно?


person bhzag    schedule 05.02.2015    source источник


Ответы (4)


Удаление записей с панели управления — это большая работа, если вам нужно удалить несколько записей.

Лучший обходной путь — создать отдельный тип записи, который будет содержать одну запись для каждого дня. Затем в записях, которые вы хотите удалить за этот день, установите CKReference для этой конкретной записи дня и установите для ее действия значение CKReferenceAction.DeleteSelf.

После этого вам нужно только удалить запись дня, и все связанные записи будут удалены. Удаление этой записи можно легко выполнить с панели инструментов, или вы можете создать функциональность в своем приложении, или вы можете создать второе приложение для административных действий.

person Edwin Vermeer    schedule 05.02.2015

Попробуйте что-то вроде этого:

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

                }

            })

        }

    }

}

"RECORD TYPE" должен быть вашим типом записи. Надеюсь это поможет.

person Pranav Wadhwa    schedule 05.04.2016
comment
это намного медленнее из-за цикла for, если у вас более 3-5 записей, это займет больше минуты! вы должны использовать пакетное удаление следующим образом: stackoverflow.com/a/36414506/530884 - person Shaybc; 05.04.2016
comment
Этот цикл запускает несколько асинхронных операций одну за другой! Сколько одновременных подключений вы готовы иметь? Я бы сериализовал как-нибудь. - person Nicolas Miari; 06.10.2016

этот код может удалить любое количество записей

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)
    }
 }
person Vincenso    schedule 27.03.2018

person    schedule
comment
Разве нет ограничения на количество записей, которые вы можете удалить в одном пакете, когда вы делаете это таким образом? - person Daniel Brower; 11.04.2020
comment
По какой-то причине это не работает для меня. Когда я позже извлекаю из базы данных, все записи, которые должны были быть удалены, все еще там. - person Daniel Brower; 11.04.2020