Как принудительно заменить хранилище CoreData обновлением приложения?

У меня есть активное приложение в AppStore, которое поставляется с заполненным хранилищем данных. Теперь я хочу отправить новую версию с немного обновленной схемой и новым набором данных. Старые данные не имеют значения. Если я просто запущу новую версию приложения, я полагаю, что существующие пользователи столкнутся с ошибкой с несовместимым хранилищем данных... как этого избежать? Мне не нужно переносить существующие данные, все это в новом приложении.

ИЗМЕНИТЬ:

К вашему сведению, вот URL-адрес, по которому я загружаю постоянное хранилище в своем диспетчере объектов:

NSURL *storeURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"MyObjects" ofType:@"storedata"]];

person Bryan    schedule 18.10.2012    source источник


Ответы (1)


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

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

Я думаю, что удаление существующего файла хранилища, а затем создание нового должно сделать это.

Если _storeURL — это путь к файлу вашего магазина, вы можете удалить его следующим образом:

NSError *error = nil;
if ([fileManager fileExistsAtPath:_storeURL.path])
  [fileManager removeItemAtURL:_storeURL error:&error];

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

person sergio    schedule 18.10.2012
comment
Спасибо, это может помочь. На самом деле я загружаю постоянное хранилище из основного пакета. (см. мое редактирование) создает ли CoreData доступную для записи версию этого в другом месте? У меня сложилось впечатление, что вы не можете изменять файлы в основном пакете. Может я ошибаюсь? Мое приложение определенно сохраняет новые объекты в БД. - person Bryan; 18.10.2012
comment
Вы имеете в виду, что ваша БД доступна только для чтения? если это в основном комплекте, то так и должно быть... - person sergio; 19.10.2012
comment
Теперь это сложная часть... это не только для чтения. Либо я пишу в файл mainBundle, либо что-то происходит под капотом. Хотел бы я сказать, что это такое. - person Bryan; 19.10.2012
comment
Я имею в виду, что вы не можете писать в комплекте на устройстве... вы должны копировать хранилище в какой-то каталог данных... Бьюсь об заклад... :-) - person sergio; 19.10.2012
comment
О боже... ОМГ. Я тестировал эту функцию только на симуляторе. :| Включите режим паники. - person Bryan; 19.10.2012
comment
Да, это совсем не работает, как я думал на устройстве. Очень глупо с моей стороны. Спасибо, что помог мне исправить это, Серхио. Теперь это имеет смысл. - person Bryan; 19.10.2012