【问题标题】:Why entries are not deleted until app is restarted or I execute my NSBatchDeleteRequest twice?为什么在重新启动应用程序或执行两次 NSBatchDeleteRequest 之前不会删除条目?
【发布时间】:2019-05-18 06:48:51
【问题描述】:

我正在阅读Delete/Reset all entries in Core Data?

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

  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()
}

【问题讨论】:

  • 你在使用多个上下文吗?
  • 这是一个虚拟应用程序。它是一个具有单个 persistentContainer 属性的 viewController。所有操作都使用persistentContainer 属性的上下文...
  • 我进行了编辑。我忘了做saveContext。然而,如果我打电话给我的clearCoreDataStore 并查询......我会得到一个结果。但是,如果我再次调用,则不会返回任何内容。不知道为什么我需要做两次......
  • 我问过这个问题,但我改变了它,因为我想获得更多的上下文 b4 询问 xD ......无论如何.. 很高兴你发现了这个问题

标签: ios core-data nsmanagedobject nsmanagedobjectcontext nsbatchdeleterequest


【解决方案1】:

从持久存储中删除的对象可能也在内存中的对象上下文中。如果是这样,则必须首先更新该内存上下文以反映删除。彻底的讨论can be found here

简而言之……

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])

【讨论】:

  • 有道理。我尝试了您的建议,它在第一次尝试时正确删除,不需要重新启动。这确实解释了为什么我需要重新启动应用程序。这是否也解释了为什么我需要做两次NSBatchDeleteRequest 才能工作?我已经对问题进行了编辑,以澄清我面临的问题。
  • @Honey,是的,它解释了这两种行为模式。使用主队列并发,同步发生在您的应用程序从主运行循环返回之后。第一个查询显示陈旧数据的原因是您的应用尚未返回(在当前运行循环迭代中)。第二个查询在所有内容再次同步后发生。
  • 第一个查询显示陈旧数据的原因是您的应用尚未返回(在当前运行循环迭代中)什么?!这不像我在瞬间调用它......我在 5 秒后查询它......但它仍在被检索。我错过了什么吗?
  • 对不起,你能看看我最后的评论吗?
  • @Honey - 抱歉我错过了。经过一些研究,我没有找到任何权威的东西来说明内存中的上下文何时肯定会被动更新。我的错误假设是行为类似于 NSUserDefaults 但您发现了相反的证据。我可以想象关心这一点的唯一原因是,如果我要构建依赖于这种模糊(并且显然没有记录)行为的逻辑。我建议不要这样做。即使您找到了可重复的工作模式,您也可能会因操作系统更改而失败。
猜你喜欢
  • 2016-04-04
  • 2010-10-04
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
相关资源
最近更新 更多