核心数据:使用 loadPersistentStores 设置时如何重置所有内容?

Posted

技术标签:

【中文标题】核心数据:使用 loadPersistentStores 设置时如何重置所有内容?【英文标题】:Core Data: how to reset everything when setup with loadPersistentStores? 【发布时间】:2018-12-27 14:16:02 【问题描述】:

当使用带有loadPersistentStores 的“新”ios 10 Core Data 设置时,如何重置/删除所有内容?我想避免使用实体名称,但喜欢使用 destroyPersistentStore 之类的名称。

我的堆栈设置如下:

persistentContainer = NSPersistentContainer(name: "CoreData", managedObjectModel: mom)
let storeDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let url = storeDirectory.appendingPathComponent("CoreData.sqlite")
let description = NSPersistentStoreDescription(url: url)
description.shouldInferMappingModelAutomatically = true
description.shouldMigrateStoreAutomatically = true
persistentContainer.persistentStoreDescriptions = [description]

persistentContainer.loadPersistentStores(completionHandler:  (_, error) in
    guard let error = error as NSError? else  return 
    fatalError("Unresolved error: \(error), \(error.userInfo)")
)
persistentContainer.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
persistentContainer.viewContext.undoManager = nil
persistentContainer.viewContext.automaticallyMergesChangesFromParent = true

我只找到了解决方案,例如BatchDeleteRequests 我需要知道所有实体名称,但我想要更通用的东西并重置所有内容 - 当用户注销时,我需要最高效/最安全的方式。

【问题讨论】:

destroyPersistentStoreAtURL(_:withType:options:) 有帮助吗? 之后如何重新设置? 与addPersistentStore(ofType:configurationName:at:options:) 但我不是第一次这样做,那么完整的东西应该是什么样子?不知道这是否是唯一/最好的方法...... 【参考方案1】:

此建议执行以下步骤

persistentStoreCoordinator获取商店 保存店铺网址 重置托管对象上下文 摧毁商店 添加新商店

代码假定 iOS 10+ NSPersistentContainer API 的标准实现在 AppDelegate 和 SQLite 商店中具有 persistentStoreCoordinatormanagedObjectContext 属性。

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let persistentStoreCoordinator = appDelegate.persistentContainer.persistentStoreCoordinator
let currentStore = persistentStoreCoordinator.persistentStores.last!
let currentStoreURL = currentStore.url!
appDelegate.managedObjectContext.reset()
do 
    try persistentStoreCoordinator.destroyPersistentStore(at: currentStoreURL, ofType: NSSQLiteStoreType)
    try persistentStoreCoordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: currentStoreURL)
 catch 
    print(error)

在 iOS 中,我建议立即添加一个新商店,因为通常应用程序不会终止,因此不会重新创建持久化容器。

【讨论】:

不幸的是,这没有回答如何使用我的问题中的设置重置堆栈... 由于没有重新创建协调器,设置是否保留?如果没有,请将应用设置的代码放入方法中,并在重置后再次调用此方法。 @swalkner 你能澄清一下你想要什么,这不会做吗?你提到想要使用destroyPersistentStore,它确实如此。

以上是关于核心数据:使用 loadPersistentStores 设置时如何重置所有内容?的主要内容,如果未能解决你的问题,请参考以下文章

更改核心数据堆栈后使用核心数据创建 SQLite 文件后未更新

从核心数据同步数据

核心数据,使用啥并发模型?

使用核心数据时出错

使用 JSON 键值 ( id ) 更新核心数据

如何使用tableview删除核心数据中的数据