【问题标题】:Completely Reset CoreData完全重置 CoreData
【发布时间】:2019-04-30 03:06:30
【问题描述】:

我已经完全搞定了这个问题,并且已经有大约一周的时间没有想法了。

我有一个包含多个协调器和托管上下文的 CoreData 堆栈,我正在尝试在应用中实现 注销 功能。

与 CoreData 交互的 tableviews 在 TabBarController 内,并且有引导(即注册和登录)NavigationControllers 和 ViewControllers 通向它。

我试图实现的是注销(即展开到初始 ViewController。到目前为止我已经尝试过 - 无济于事:

  • reset() 每个 managedObjectContext 单独
  • tableView.beginUpdates()、tableView.endUpdates()、tableView.reloadData()、frc.performFetch() 的所有可能组合
  • 删除每个 managedObject 中的每个实体,然后分别 reset() 每个 managedObjectContext
  • 将 tableView、fetchedResultsController 委托和数据源设置为 nil,然后在 viewDidLoad() 上设置为 self
  • 在注销前触发 NSNotification - 删除 CoreData 中的所有内容并保存它,从而有效地更新和清空表。
  • 还有很多

有没有办法完全重置 CoreData,所以当用户展开到初始 ViewController 并重新运行整个过程时,我不会得到

严重的应用程序错误。在 Core Data 期间捕获到异常 变更处理。这通常是观察者内部的错误 NSManagedObjectContextObjectsDidChangeNotification。尝试插入 第 9 行到第 0 节,但在第 0 节之后只有 9 行 使用 userInfo (null) 更新

或者在我通过通知清空表格的情况下:

严重的应用程序错误。在 Core Data 期间捕获到异常 变更处理。这通常是观察者内部的错误 NSManagedObjectContextObjectsDidChangeNotification。尝试插入 第 9 行到第 0 节,但在第 0 节之后只有 0 行 使用 userInfo (null) 更新

如果我注销、关闭应用程序并重新启动,

CoreData很好。这种方式没有错误。这让我认为有一种方法可以完全重置 CoreData(以及与之关联的任何 tableViews、fetchedResultsControllers)或在展开到初始 ViewController 时重置为原始状态。

或者我应该只是复制故事板并有一组单独的载入视图控制器仅用于注销,以便 CoreData 不会重新初始化?

有什么想法吗?谢谢。

【问题讨论】:

  • 嗨...我很清楚您的问题,您是否愿意在您从应用程序注销时重置核心数据以及在您登录核心数据的整个过程时以初始级别进行?我猜对了吗?
  • 你试过这个链接了吗:stackoverflow.com/questions/24658641/…
  • @Anita 是的,这是正确的!如果您愿意,我希望完全 销毁和核对 CoreData,而不仅仅是单个整体。尽管注销(展开)、批量删除请求和上下文重置,但表格视图仍以某种方式持续存在。
  • 以上链接可能对你有帮助

标签: ios swift xcode uitableview core-data


【解决方案1】:

试试这个!

  static let moduleName = "moduleName"

        //Model
        lazy var managedObjectModel:NSManagedObjectModel = {
            let modelURL = Bundle.main.url(forResource: moduleName, withExtension: "momd")!
            return NSManagedObjectModel(contentsOf: modelURL)!
        }()

     func deleteAllEntities() {
            let entities = managedObjectModel.entities
            for entity in entities {
                delete(entityName: entity.name!)
            }
        }

func delete(entityName: String) {
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
        do {
            try persistentStoreCoordinator.execute(deleteRequest, with: DataCoordinator.shared.managedObjectContext)
            debugPrint("Deleted Entitie - ", entityName)
        } catch let error as NSError {
            debugPrint("Delete ERROR \(entityName)")
            debugPrint(error)
        }
    }

【讨论】:

  • 这只会删除实体。我一直在寻找的是彻底摧毁 sqlite 商店。
【解决方案2】:

在 iOS9 及更高版本中,您可以使用 destroyPersistentStore 并可选择添加一个新的

func destroyAllData(storeType : String = NSSQLiteStoreType) throws {
    guard let storeURL = persistentStoreCoordinator.persistentStores.last?.url else {
        print("Missing store URL")
        return
    }
    try persistentStoreCoordinator.destroyPersistentStore(at: storeURL, ofType: storeType)
    // try persistentStoreCoordinator.addPersistentStore(ofType: storeType, configurationName: nil, at: storeURL)
}

【讨论】:

  • 感谢主,您是救世主!将此扩展为在多个商店/协调器上工作,重新添加 sqlite 商店,它就像魔术一样工作!为什么我没有意识到这是难以置信的!
猜你喜欢
  • 2018-07-19
  • 1970-01-01
  • 2015-05-07
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
相关资源
最近更新 更多