Я делаю легкую миграцию основных данных, выполняя следующие шаги:
Управление версиями модели данных
Создание нового хранилища постоянства, которое будет совместимо с новой моделью данных.
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
// Initialize Persistent Store Coordinator
let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
// URL Persistent Store
let URLPersistentStore = self.applicationStoresDirectory().appendingPathComponent("FieldSense.sqlite")
do {
// Declare Options
let options = [ NSMigratePersistentStoresAutomaticallyOption : true, NSInferMappingModelAutomaticallyOption : true ]
// Add Persistent Store to Persistent Store Coordinator
try persistentStoreCoordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: URLPersistentStore, options: options)
} catch {
let fm = FileManager.default
var isDir : ObjCBool = false
if fm.fileExists(atPath: (URLPersistentStore?.path)!, isDirectory: &isDir){
// if fm.fileExistsAtPath(URLPersistentStore.path!) {
let nameIncompatibleStore = self.nameForIncompatibleStore()
let URLCorruptPersistentStore = self.applicationIncompatibleStoresDirectory().appendingPathComponent(nameIncompatibleStore)
do {
// Move Incompatible Store
// try fm.moveItemAtURL(URLPersistentStore, toURL: URLCorruptPersistentStore)
try fm.moveItem(at: URLPersistentStore!, to: URLCorruptPersistentStore!)
} catch {
let moveError = error as NSError
print("\(moveError), \(moveError.userInfo)")
}
}
do {
// Declare Options
let options = [ NSMigratePersistentStoresAutomaticallyOption : true, NSInferMappingModelAutomaticallyOption : true ]
try persistentStoreCoordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: URLPersistentStore, options: options)
} catch {
let storeError = error as NSError
print("\(storeError), \(storeError.userInfo)")
}
// Update User Defaults
let userDefaults = UserDefaults.standard
userDefaults.set(true, forKey: "didDetectIncompatibleStore")
}
return persistentStoreCoordinator
}()
Но когда пользователь обновляет приложение из магазина приложений, существующие пользовательские данные стираются. В чем может быть причина?