2010-09-30 5 views
1

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

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";

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

+0

Проблема решена !!! Мне пришлось переустановить приложение на симуляторе ;-) –

ответ

2

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

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

к моему AppDelegate в 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

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

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

бросить симулятор

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

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

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

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

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

Copy этот файл в другое место

Stop работает приложение в X-Code

Перетащите клавишу { appname} .sqlite файл в список файлов в X-коде.

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

Product > Clean

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

Теперь вы должны иметь рабочую SQLite файл!

Cheers, Robert