Дамп после некоторых изменений в модели CoreData - PullRequest
1 голос
/ 30 сентября 2010

Я сделал некоторые изменения в моей модели CoreData.До сих пор я добавил атрибут «язык».Когда мое приложение запускается и я нажимаю «Создать нового клиента», создается переменная экземпляра «Клиент».Эта переменная создается:

Customer *newCustomer = [NSEntityDescription insertNewObjectForEntityForName:@"Customer" inManagedObjectContext:appDelegate.managedObjectContext];

До того, как я сделал эти изменения, все работало нормально и как планировалось.Но теперь я получаю дамп с этим сообщением об ошибке: reason = "The model used to open the store is incompatible with the one used to create the store";

Что мне нужно сделать, чтобы решить эту проблему?Сброс хранилища пока не помог.

Ответы [ 2 ]

2 голосов
/ 06 октября 2010

Что я сделал, чтобы обойти эту проблему, так это добавив

[[NSFileManager defaultManager] removeItemAtURL: storeURL error: nil];

в мое приложениеУправление вpersistentStoreCoordinator перед добавлением постоянного хранилища.Это удаляет существующее хранилище, которое больше не совместимо с вашей моделью данных.Не забудьте прокомментировать эту строку, прежде чем запускать приложение в следующий раз, если вы хотите сохранить то, что хранится.

Моя реализация persistentStoreCoordinator выглядит следующим образом, когда мне нужно удалить старое хранилище.

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (persistentStoreCoordinator_ != nil) {
    return persistentStoreCoordinator_;
}
NSError *error = nil;
NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MyPinballScore.sqlite"]];
//The following line removes your current store so that you can create a new one that is compatible with your new model
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];

persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}    

return persistentStoreCoordinator_;

}

0 голосов
/ 23 ноября 2011

Ответ немного сложен, но это всегда работает для меня.Это для чистой установки нового совместимого файла .sqlite, , а не для миграции !

, запустите симулятор, удалите приложение и данные (всплывающее окно послеудалить приложение).

выйти из симулятора

открыть X-код, после внесения любых изменений в модель данных

удалить файл {*appname*}.sqlite (или создать резервную копию,удалите его из папки проекта и удалите ссылку)

очистите приложение (Product > Clean)

Запустите приложение в симуляторе (для этого урока я буду считать 4.2)

Во время работы симулятора в окне Finder перейдите к: {*home*} > Library > Application Support > iPhone Simulator > 4.2 > Applications > {*random identifier*} > Documents > {*appname*}.sqlite

Скопируйте этот файл в другое место

Прекратите запуск приложения в X-Code

Перетащите файл { appname }. Sqlite в список файлов в X-Code.

В появившемся диалоговом окне убедитесь, что copy to folderфлажок, проверен.

Product > Clean

Затем снова запустите приложение в симуляторе

Теперь у вас должен быть рабочий sqlite fиль!

Ура, Роберт

...