iOS – 保持旧的SQLite数据库,同时更新到新版本

我发现了一些其他的问题,但我没有得到任何清楚的想法如何保持从旧数据库的数据,而在iOS应用程序更新。

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

如果情况1是“是”:我可以插入新列还是对旧数据库进行更改,是否安全?

如果情况1是否:我可以在新的数据库中获取旧的数据库数据吗? 旧数据库会被删除吗?

情况2:如果我给新数据库一个不同的名称(它将被包含在捆绑中)? 如果给新的名字保留旧的数据库,我可以删除旧的数据库编程?

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

寻找帮助.. 🙂

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

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

如果情况1是“是”:我可以插入新列还是对旧数据库进行更改,是否安全?

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

假设你已经将.sqlite文件复制到文档文件夹,并且在更新应用程序时,它会查找数据库,可以更新其表并更新其数据库,而不会丢失任何东西。

如果我理解你的问题(你正在更新已经通过App Store部署的模型),那么你可以使用Xcode中的.xcdatamodeld格式来升级现有的模型。 苹果的Core Data Versioning doc全面涵盖了这个话题。

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

为您的模型添加新版本;

  • select你的xcdatamodel文件(例如model.xcdatamodel)
  • 点击编辑器>添加模型版本
  • 根据模型1命名新的模型版本(例如模型2)
  • 打开“实用程序”窗格
  • 为当前型号版本select“型号2”

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

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

另外,值得注意的是:Applebuild议您只将用户相关的文件存储在“文档”文件夹中 。 SQLite数据库文件和类似文件应该存储在/ Library / Application Support中。