如何删除PersistentStore并重新创建它以添加新数据?

时间:2019-03-14 12:06:25

标签: ios swift core-data nspersistentstore

我在我的应用程序中使用CoreData数据库。我需要删除它(模型和所有数据),并在更新应用程序时重新创建它。

要删除它,我使用destroyPersistentStore函数。 但是删除后,我需要重新创建persistentStores,以用新数据填充它。

这里是我的CoreDataManager班:

class CoreDataManager {

    static let sharedManager = CoreDataManager()
    private init() {}

    lazy var persistentContainer: NSPersistentContainer = {

        let container = NSPersistentContainer(name: storeName)
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in

            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

   func resetCoreData(){

        guard let firstStoreURL = self.persistentContainer.persistentStoreCoordinator.persistentStores.first?.url else {
            print("Missing first store URL - could not destroy")
            return
        }

        do {
            try self.persistentContainer.persistentStoreCoordinator.destroyPersistentStore(at: firstStoreURL, ofType: NSSQLiteStoreType, options: nil)
        } catch  {
            print("Unable to destroy persistent store: \(error) - \(error.localizedDescription)")
        }
   }

 func recreateCoreData() {
        do {
             try self.persistentContainer.persistentStoreCoordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: storeName, at: firstStoreURL, options: nil)
         } catch {
             print("Unable to create persistent store: \(error) - \(error.localizedDescription)")
         }
  }
}

我的recreateCoreData通话出现错误,因为商店与创建时使用的商店不兼容。

怎么了?

编辑:

数据库模型在2个版本之间没有变化。

错误:

Error Domain=NSCocoaErrorDomain Code=134020 "The model configuration used to open the store is incompatible with the one that was used to create the store."

1 个答案:

答案 0 :(得分:0)

这可能是由于调用configurationName时由于参数addPersistentStore而引起的:

addPersistentStore(ofType: NSSQLiteStoreType, configurationName: storeName, ...)

配置名称不是商店名称,如果将其从现有商店中转储,则会得到PF_DEFAULT_CONFIGURATION_NAME

您可以在现有商店(firstStore.configurationName中使用它,或者通过再次调用persistentContainer.loadPersistentStores(...)来简化一点工作。

示例项目:https://github.com/ralfebert/CoreDataReset