swift - 核心数据 : how to reset everything when setup with loadPersistentStores?

标签 swift core-data

当使用带有 loadPersistentStores 的"new"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,我需要知道所有实体名称,但我想要更通用的东西并重置所有内容 - 当用户注销时,我需要最高效/最安全的方式。

最佳答案

这个建议执行以下步骤

  • 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 中,我建议立即添加新商店,因为通常应用程序不会终止,因此不会重新创建持久容器。

关于swift - 核心数据 : how to reset everything when setup with loadPersistentStores?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53946485/

相关文章:

ios - 使用 Alamofire 将 Json 发布到 API?

json - 如何从 firebase 实时数据库获取位置标记并使用 swift 添加到 Xcode 中的 map View

ios - 应用程序内购买

xcode - 核心数据关系设置

ios - CoreStore如何观察数据库的变化

swift - Gigya 在 Swift 项目初始化期间崩溃

objective-c - NSPredicate检索其1:n关系中的属性不是NIL的所有对象

ios - 带有 iCloud 的 CoreData : Receiving empty data on NSPersistentStoreDidImportUbiquitousContentChangesNotification

iOS 在 Core Data 中存储数百张照片是否可以接受?

swift - 将 guard 与非可选值赋值一起使用