iOS - 在更新到新版本时保留旧的sqlite数据库

时间:2014-01-30 05:15:48

标签: ios iphone sqlite core-data ios7

我发现了一些其他问题,但我没有清楚地了解如何在ios中更新应用程序时保留旧数据库中的数据。

案例1: 我可以保留旧数据库吗?

如果案例1为是: 我可以在旧数据库中插入新列或进行任何更改吗?它是否安全?

如果案例1为否: 我可以在新数据库中获取旧数据库数据吗?旧数据库会被删除吗?

案例2:如果我为新数据库提供了不同的名称(它将包含在捆绑包中)?如果给新名称保留旧数据库,我可以以编程方式删除旧数据库吗?

最佳做法是什么?为数据库文件指定一个新名称以保留旧名称,然后将旧文件复制到新数据库并删除旧数据库文件?刚开始使用旧的?

寻求帮助.. :)

3 个答案:

答案 0 :(得分:3)

案例1:我可以保留旧数据库吗?

是的,更新您的应用程序不会删除存储在文档目录中的数据库文件。 (但如果它在你的包中,它将被删除)

如果案例1为是:我可以在旧数据库中插入新列或进行任何更改吗?是否安全?

这取决于你的实施。您可以使用ALTER TABLE查询添加或删除列。您需要处理代码中的新更改,否则可能会导致问题。 添加列不会在正常情况下导致任何问题(取决于插入查询语句和新字段约束)

答案 1 :(得分:0)

假设您已将Case 1文件复制到文档文件夹,并且当您更新应用程序时,它将查找数据库,可以更新其表并更新其数据库而不会丢失任何内容,这是相当.sqlite

答案 2 :(得分:0)

如果我理解您的问题(您希望更新已通过App Store部署的模型),是的,您可以使用Xcode中的.xcdatamodeld格式对现有模型进行升级。 Apple的Core Data Versioning doc全面涵盖了这一主题。

这可能是一个繁琐的过程,如果您的模型中存储了宝贵的用户数据,您需要在推出更新之前对其进行详尽的测试。

向模型添加新版本;

  • 选择您的xcdatamodel文件(例如model.xcdatamodel)
  • 点击编辑器>添加模型版本
  • 根据模型1
  • 命名新模型版本(例如模型2)
  • 打开“工具”窗格
  • 为当前模型版本选择“模型2”

然后将此方法添加到控制器类实现文件中,以帮助对数据模型进行小的更改(更改字段类型,添加列等)。

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

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

    NSError *error = nil;

    // for performing minor changes to the coredata database
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],
                         NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES],
                         NSInferMappingModelAutomaticallyOption, nil];

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
          NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    return _persistentStoreCoordinator;
}

另外,值得注意的是:Apple建议您only store user relevant files in the Documents folder。 SQLite数据库文件和类似文件应存储在/ Library / Application Support中。