0

我有一个应用程序正在使用一个包含大约 3.000 条记录的相当大的数据库。以前我在第一次启动应用程序时已经加载了数据库,但是我现在拥有的记录数量我正在实施一个预填充的数据库以节省时间。

我的问题是从应用商店更新应用到设备时会发生什么,应用会知道数据库有更新版本并加载新数据库,还是继续使用应用中已经处于活动状态的数据库?

我在我的应用程序中使用此代码来使用预填充的核心数据数据库:

- (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;

}

4

2 回答 2

2

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

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

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

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

于 2012-06-30T15:47:27.020 回答
0

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

于 2012-06-30T14:18:25.727 回答