更新包含预先填充的数据库的应用程序

时间:2012-06-30 14:15:38

标签: iphone objective-c ipad core-data

我的应用程序正在使用一个包含大约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;

}

2 个答案:

答案 0 :(得分:2)

让我们说您当前在应用商店中的应用是版本1.0。这个应用程序在首次启动时下载了一个DB。 现在,您将发布一个新版本1.1,它将在应用程序本身中捆绑数据库。

当现有应用程序(1.0)的用户升级到1.1时,完全由您控制。实际上,1.1版可以在首次启动时检查在1.0版本安装它的用户目录中是否存在DB。如果它存在,那么版本1.1知道它应该通过从资源目录复制它来升级数据库。

实际上,在任何情况下都必须将数据库复制到用户目录,因此通过检查可以确保不会删除任何用户数据。

通常,您可以在NSUserDefaults中存储版本号,以便您的应用的每个未来版本都有办法知道它是否是新安装的升级(如果版本号在那里,那么它是该特定版本的升级,否则是新安装。

答案 1 :(得分:0)

更新应用时,已创建的文件仍然存在,因此应用的旧版本仍将使用您在旧版本中创建的旧数据库