完全重置CoreData

时间:2018-11-28 08:55:11

标签: ios swift xcode uitableview core-data

我已经完全不了解这个想法了大约一个星期。

我有一个带有多个协调器和托管上下文的CoreData堆栈,并且我尝试在该应用程序中实现 注销 功能。

与CoreData交互的表视图位于TabBarController内部,并且有内置的(即注册和登录)NavigationControllers和ViewControllers导致。

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

  • 分别重置每个ManagedObjectContext
  • tableView.beginUpdates(),tableView.endUpdates(),tableView.reloadData(),frc.performFetch()的所有可能组合
  • 删除每个ManagedObject中的每个实体,然后分别重置()每个ManagedObjectContext
  • 将tableView,fetchedResultsController委托和数据源设置为nil,然后将其自身设置为viewDidLoad()
  • 具有一个NSNotification,该NSNotification会在注销之前触发-删除CoreData中的所有内容并将其保存,从而有效地更新和清空表。
  • 更多

有没有办法完全重置CoreData,因此当用户放松到初始ViewController并重新运行整个过程时,我不会得到

  

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

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

  

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

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

CoreData可以正常运行 。这样没有错误。这使我认为有一种方法可以完全重置CoreData(以及与之关联的任何tableViews,fetchedResultsControllers)或退回到初始ViewController时重置为原始状态。

还是我应该复制情节提要,并拥有一组单独的用于登出的viewControllers,以便注销CoreData而不重新初始化?

有什么想法吗?谢谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

尝试一下!

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