Как удалить PersistentStore и воссоздать его, чтобы добавить новые данные? - PullRequest
0 голосов
/ 14 марта 2019

Я использую базу данных 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 вызов, потому что хранилище несовместимо с тем, которое использовалось при его создании.

Что не так?

РЕДАКТИРОВАТЬ:

Модель базы данных не менялась между двумя версиями.

Ошибка:

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 голосов
/ 14 марта 2019

Это, вероятно, происходит из-за параметра configurationName при вызове addPersistentStore:

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

Имя конфигурации не является именем магазина, если вы выгрузите его из существующего хранилища, вы получите PF_DEFAULT_CONFIGURATION_NAME в результате.

Вы можете использовать это из существующего хранилища (firstStore.configurationName), или imho немного проще, снова вызвав persistentContainer.loadPersistentStores(...).

Пример проекта: https://github.com/ralfebert/CoreDataReset

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...