Обновление живого приложения в магазине для использования базовых данных, которые в настоящее время не используют базовые данные - PullRequest
0 голосов
/ 22 апреля 2011

У меня в настоящее время есть приложение в магазине, которое поддерживается SQLite и не использует Core Data. В прошлом, когда я хотел выпустить обновление с изменениями SQLite, оно включало в себя некоторый код, который определял бы версию приложения и программно обновлял таблицы при необходимости. Сейчас я работаю над обновлением, которое использует Core Data. Меня не волнуют какие-либо старые данные, которые в данный момент находятся в рабочем состоянии, и я знаю, как можно программно удалить все старые таблицы SQLite. Все ли файлы модели базовых данных включены в двоичный файл обновления, или мне нужно программно сгенерировать некоторые или все модели базовых данных? Будет ли .xcdatamodeld включен в бинарный файл? Любые другие подводные камни, которые я должен опасаться?

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 22 апреля 2011

Обновление App Store заменяет весь пакет приложений, поэтому в него будет включено все, что входит в ваш пакет приложений, включая любую модель Core Data.Вы можете проверить это, установив специальную сборку или сборку разработчика поверх сборки App Store на собственном устройстве (без предварительного удаления).В скомпилированном приложении файлы модели компилируются или обрабатываются и имеют различные расширения (.momd, .mom).Таким образом, вы увидите их вместо .xcdatamodeld или .xcdatamodel.

Другие подводные камни: теперь файл Core Data data не является частью вашего пакета.Если вы хотите, чтобы обновленное приложение запускалось с пустой базы данных, вам не нужно делать ничего особенного.Но если вы хотите установить / обновить предварительно заполненную базу данных, вам нужно найти способ поместить эту базу данных в папку для чтения и записи на устройстве.По сути, вы генерируете файл Core Data, включаете его в комплект приложений как часть вашего проекта XCode, а затем при первом запуске программно копируете его где-то в ваших папках Documents или Library (используя правильный API-интерфейс Cocoa для их поиска).

Подводный камень # 2: изменение пустого файла основных данных с помощью SQLLite на Mac предлагается на некоторых веб-сайтах, но специально не рекомендуется Apple.Вместо этого вы можете написать приложение для iOS, которое помещает данные в основные данные и запускает их в симуляторе. Как инициализировать хранилище с данными по умолчанию?

Как указал user387184, ваше следующее обновление, которое изменяет модель в существующей базе данных Core Data, может оказаться сложным.Постарайтесь сделать модель как можно лучше с первого раза.

0 голосов
/ 22 апреля 2011

С основными данными это может быть довольно сложно при обновлении до новой версии.Я много раз сталкивался с тем, что даже малейшие изменения в базовой модели данных вызывают странное поведение приложения (понятное до некоторой степени).Самый простой способ избежать любых нежелательных побочных эффектов - просто изменить имя.Здесь код

- (NSPersistentStoreCoordinator *) persistentStoreCoordinator {
//  D_IN;   
if (persistentStoreCoordinator != nil) {
    return persistentStoreCoordinator;
}
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

// Allow inferred migration from the original version of the application.
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"myData073.sqlite"]];

NSError *error = nil;

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl 
                                                    options:options error:&error]){
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);


}
//  D_OUT;

return persistentStoreCoordinator;

}

Так что все, что вам действительно нужно сделать, это изменить имя myData073.sqlite на, например, myData074.sqlite

Описание модели данныхФайл на самом деле не является частью двоичного файла, но модель, стоящая за ним со всеми классами и методами доступа, безусловно, есть.Вам не нужно беспокоиться об этом.ps даже во время разработки я часто меняю имя, иначе можно потратить много времени на поиск ошибок кодирования, которых на самом деле нет ...

...