Удалить все основные записи данных не устанавливает hasChanges в managedContext - PullRequest
0 голосов
/ 21 января 2019

Я новичок в coreData, и у меня проблема:

Мое приложение выполняет следующие 3 последовательных основных функции данных:

    let managedContext = persistentContainer.viewContext
    deleteAllCDRecords(managedContext: managedContext, in: "CDShoppingItem")
    saveManagedContext(managedContext: managedContext)  

Они определены (сокращены) как:

private func deleteAllCDRecords(managedContext: NSManagedObjectContext, in entity: String) {
    let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
    do {
        try managedContext.execute(deleteRequest)
    } catch let error as NSError {
        // error handling
    }
} // deleteAllCDRecords  

и

private func saveManagedContext(managedContext: NSManagedObjectContext) {
    if !managedContext.hasChanges { return }
    do {
        try managedContext.save()
    } catch let error as NSError {
        // error handling
    }
} // saveManagedContext  

Проблема:

После выполнения deleteAllCDRecords, managedContext.hasChanges в функции saveManagedContext не соответствует действительности , поэтому удаление не сохраняется в постоянном хранилище.

Мой вопрос:
Что не так с моим кодом?

1 Ответ

0 голосов
/ 21 января 2019

Пакетные операции удаляются в самом постоянном хранилище.Таким образом, в этом особом случае вы удаляете сущности из постоянного хранилища и впоследствии должны удалять объекты в памяти.

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

После выполнения пакетного удаления удалите все объекты в памяти, которые были удалены изпостоянный магазин.

См. https://developer.apple.com/library/archive/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html.

...