2012-06-30 3 views
0

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

Мой вопрос заключается в том, что происходит при обновлении приложения, начиная с appstore, до устройства будет знать, что есть обновленная версия базы данных и загрузка новой базы данных или продолжение использования базы данных, которая уже активна с приложение?

Я использую этот код в моем приложении, чтобы использовать предварительно заполненные Core Data DB:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (persistentStoreCoordinator != nil) { 
    return persistentStoreCoordinator; 
} 

NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"database.sqlite"]; 

/* 
Set up the store. 
For the sake of illustration, provide a pre-populated default store. 
*/ 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
// If the expected store doesn't exist, copy the default store. 
if (![fileManager fileExistsAtPath:storePath]) { 
    NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"database" ofType:@"sqlite"]; 
    if (defaultStorePath) { 
     [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL]; 
    } 
} 

NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; 

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 

NSError *error; 
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { 
    // Update to handle the error appropriately. 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    exit(-1); // Fail 
}  

return persistentStoreCoordinator; 

}

+0

Если ваша структура базы данных Core Data изменилась, вам может потребоваться расследование переноса данных с базовыми данными. В противном случае, как ваше приложение обрабатывает существующую базу данных полностью под вашим контролем. –

ответ

2

Предположим, что приложение, находящееся сейчас в магазине приложений, является версией 1.0. Это приложение загрузило БД при первом запуске. Теперь вы собираетесь опубликовать новую версию 1.1, которая будет связывать БД в самом приложении.

Когда пользователь существующего приложения (1.0) будет обновлен до 1.1, то что происходит полностью под вашим контролем. Действительно, версия 1.1 могла проверить при первом запуске существование БД в каталоге пользователя, где установлена ​​версия 1.0. В случае, если она есть, то версия 1.1 знает, что она должна обновить БД, скопировав ее из каталога ресурсов.

На самом деле, БД в любом случае необходимо скопировать в каталог пользователя, поэтому, проверив, что вы не сможете удалить данные пользователя.

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

0

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

+0

Хм, это было то, чего я боялся, какие-нибудь советы, как это исправить? – PeterK

Смежные вопросы