我已经完全不了解这个想法了大约一个星期。
我有一个带有多个协调器和托管上下文的CoreData堆栈,并且我尝试在该应用程序中实现 注销 功能。
与CoreData交互的表视图位于TabBarController内部,并且有内置的(即注册和登录)NavigationControllers和ViewControllers导致。
我正在尝试实现的是注销(即,展开到初始ViewController。到目前为止,我已经尝试过-无济于事:
有没有办法完全重置CoreData,因此当用户放松到初始ViewController并重新运行整个过程时,我不会得到
严重的应用程序错误。核心数据期间捕获到异常 变更处理。这通常是观察者内部的错误 NSManagedObjectContextObjectsDidChangeNotification。尝试插入 第9行进入第0部分,但在第0部分之后只有9行 使用userInfo更新(空)
或者在我通过通知清空表的情况下:
如果我注销,关闭应用程序并重新启动,则严重的应用程序错误。核心数据期间捕获到异常 变更处理。这通常是观察者内部的错误 NSManagedObjectContextObjectsDidChangeNotification。尝试插入 第9行进入第0节,但在第0节之后,只有0行 使用userInfo更新(空)
CoreData可以正常运行 。这样没有错误。这使我认为有一种方法可以完全重置CoreData(以及与之关联的任何tableViews,fetchedResultsControllers)或退回到初始ViewController时重置为原始状态。
还是我应该复制情节提要,并拥有一组单独的用于登出的viewControllers,以便注销CoreData而不重新初始化?
有什么想法吗?谢谢。
答案 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)
}
}