首页 > 解决方案 > 为什么在重新启动应用程序或执行两次 NSBatchDeleteRequest 之前不会删除条目?

问题描述

我正在阅读删除/重置核心数据中的所有条目?.

如果我按照以下步骤操作,我会得到意想不到的结果:

  1. 调用下面的代码
  2. 然后在模拟器中查询一个实体,我就取回一个实体!!!
  3. 如果我clearCoreDataStore再次调用(或重新启动),则不会从 core-data 中检索该值

我错过了什么?

func clearCoreDataStore() {
    let entities = dataManager.persistentContainer.managedObjectModel.entities
    for entity in entities {
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity.name!)
        let deleteReqest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
        do {
            try context.execute(deleteReqest)
        } catch {
            print(error)
        }
    }
    dataManager.saveContext()
}

标签: ioscore-datansmanagedobjectnsmanagedobjectcontextnsbatchdeleterequest

解决方案


从持久存储中删除的对象可能也在内存对象上下文中。如果是这样,则必须首先更新该内存上下文以反映删除。可以在此处找到详尽的讨论。

简而言之...

deleteRequest.resultType = NSBatchDeleteRequestResultType.resultTypeObjectIDs
let result = try context.execute(deleteRequest) as? NSBatchDeleteResult
let objectIDArray = result?.result as? [NSManagedObjectID]
let changes = [NSDeletedObjectsKey : objectIDArray]
NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [context])

推荐阅读