应用程序包中的预填充sqlite文件。现有用户更新后会发生什么?

时间:2015-02-12 09:12:08

标签: ios objective-c sqlite core-data

我在商店有一个应用程序,它指向文档目录中的appname.sqlite文件。这是旧代码:

NSURL *storeURL = [[self applicationDocumentsDirectory]URLByAppendingPathComponent:@"MyApp.sqlite"];

 NSError *error = nil;

_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:@{NSMigratePersistentStoresAutomaticallyOption : @YES,NSInferMappingModelAutomaticallyOption : @YES}; error:&error]) {

    abort();
}

我现在想要更新。新功能是预装的.sqlite数据库,该数据库位于包中。请参阅以下内容

NSURL *storeURL = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"MyNewPrefilled" ofType:@"sqlite"]];

在全新安装应用程序时可以正常工作。但是对于已经登录并且在db(app目录中的旧sqlite)中保存了大量数据的用户会发生什么?我会失去它,因为我现在指向应用程序包(MyNewPrefilled.sqlite)中的.sqlite而不是app目录。如何将旧数据从doc目录的旧sqlite文件恢复到捆绑包中的新数据?

仅供参考:我已经使用代码数据迁移(涉及数据模型中的版本号),当我在更新中更改数据模型时,该工作正常。

1 个答案:

答案 0 :(得分:0)

Apple建议使用两个持久存储(在同一模型中)来分隔用户生成的数据和静态数据。据推测,如果您的数据是静态的,那么您应该这样做,并为静态数据设置只读存储。请参阅“核心数据编程指南”中的示例Configurations

另一种方法是

  1. 将捆绑种子数据库复制到文档目录中,然后
  2. 读取旧商店的数据和
  3. 将其复制到新的。
  4. 最后,您可以删除旧商店。