我发现了一些其他问题,但我没有清楚地了解如何在ios中更新应用程序时保留旧数据库中的数据。
案例1: 我可以保留旧数据库吗?
如果案例1为是: 我可以在旧数据库中插入新列或进行任何更改吗?它是否安全?
如果案例1为否: 我可以在新数据库中获取旧数据库数据吗?旧数据库会被删除吗?
案例2:如果我为新数据库提供了不同的名称(它将包含在捆绑包中)?如果给新名称保留旧数据库,我可以以编程方式删除旧数据库吗?
最佳做法是什么?为数据库文件指定一个新名称以保留旧名称,然后将旧文件复制到新数据库并删除旧数据库文件?刚开始使用旧的?
寻求帮助.. :)
答案 0 :(得分:3)
案例1:我可以保留旧数据库吗?
是的,更新您的应用程序不会删除存储在文档目录中的数据库文件。 (但如果它在你的包中,它将被删除)
如果案例1为是:我可以在旧数据库中插入新列或进行任何更改吗?是否安全?
这取决于你的实施。您可以使用ALTER TABLE查询添加或删除列。您需要处理代码中的新更改,否则可能会导致问题。 添加列不会在正常情况下导致任何问题(取决于插入查询语句和新字段约束)
答案 1 :(得分:0)
假设您已将Case 1
文件复制到文档文件夹,并且当您更新应用程序时,它将查找数据库,可以更新其表并更新其数据库而不会丢失任何内容,这是相当.sqlite
。
答案 2 :(得分:0)
如果我理解您的问题(您希望更新已通过App Store部署的模型),是的,您可以使用Xcode中的.xcdatamodeld格式对现有模型进行升级。 Apple的Core Data Versioning doc全面涵盖了这一主题。
这可能是一个繁琐的过程,如果您的模型中存储了宝贵的用户数据,您需要在推出更新之前对其进行详尽的测试。
向模型添加新版本;
然后将此方法添加到控制器类实现文件中,以帮助对数据模型进行小的更改(更改字段类型,添加列等)。
- (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中。