coredata, используя старую версию файла на устройстве - PullRequest
1 голос
/ 23 апреля 2010

Это продолжение моих предыдущих проблем здесь .Сброс симулятора решил все мои проблемы раньше, и я продолжил работу над приложением.

У меня теперь точно такая же проблема при установке приложения на мое устройство iPhone.Он выбирает старую версию моей базы данных, в которой нет второй сущности, и вылетает, когда я пытаюсь получить доступ ко второй сущности:

2010-04-22 23:52:18.860 albumCloud[135:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'Image''
2010-04-22 23:52:18.874 albumCloud[135:207] Stack: (
  843263261,
  825818644,
  820669213,
  20277,
  844154820, 
  16985,   
  14633,   
  844473760,   
  844851728,   
  862896011,   
  843011267,   
  843009055,   
  860901832,   
  843738160,   
  843731504,   
  11547,   
  11500   
 )

terminate called after throwing an instance of 'NSException'

У меня два вопроса:

1) Как же я могу достаточно тщательно удалить приложение с телефона, чтобы оно удаляло старые данные?(Я до сих пор пробовал регулярно удалять приложения, удаляя и затем удерживая их дома и выключая для перезагрузки, ругаясь и угрожая приложению во время его запуска ... все)

2) Как предотвратить этокогда мое приложение находится в магазине приложений, и я по какой-то причине решаю, что я хочу добавить другой объект в магазин или другой атрибут к существующим объектам?есть ли метод «если x не существует, то создать его»?

1 Ответ

1 голос
/ 23 апреля 2010

Чтобы полностью удалить приложение, удаление его обычным способом должно сработать, то есть удерживайте его, пока оно не покачивается, и нажмите кнопку удаления. Затем подключитесь к iTunes. Возможно, iTunes каждый раз восстанавливает приложение и его резервные копии.

Для поддержки добавления новых сущностей в дальнейшем вы хотите использовать управление версиями и автоматическую облегченную миграцию, которая описана здесь:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmLightweight.html#//apple_ref/doc/uid/TP40008426-SW1

В основном вы создаете новую версию своей модели данных, используя пункт меню Design->Data Model в XCode (Редактор -> «Добавить версию модели» в XCode 4), а затем вносите несколько изменений кода. Это заставит Core Data автоматически перенести более старую модель на более новую. Вы ограничены в том, какие изменения вы можете сделать. Вы можете добавить новые сущности и либо добавить необязательный атрибут к существующим сущностям, либо обязательные атрибуты с установленными значениями по умолчанию.

Одна вещь, которая меня поразила, это то, что способ загрузки основных данных NSManagedObjectModel меняется, когда вы хотите использовать управление версиями и миграцию. Без миграции у вас, вероятно, есть это:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

Как только вы начнете использовать управление версиями и миграцию, это должно измениться на что-то вроде этого:

NSString *path = [[NSBundle bundleForClass:self.class] pathForResource:@"DataModelName"
                                                                ofType:@"momd"];
NSURL *url = [NSURL fileURLWithPath:path];
NSManagedObjectModel *model = [[[NSManagedObjectModel alloc] initWithContentsOfURL:url] autorelease];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...