我一直用coredata来解决这个问题,这让我疯狂,因为它应该是直接的前进
我目前正在开发这个应用程序的第一个版本,显然我一直在推测核心数据模型,
但是每次更改核心数据模型时,我都需要卸载应用程序并重新安装新版本。
虽然它只是我,但这是可以通过的,但一旦发布,我需要能够在不重新安装用户的情况下更改应用程序。
我缺少什么,
是否需要编写一些代码来告诉核心数据如何将现有的持久数据修改为新数据?
谢谢你的帮助
杰森
答案 0 :(得分:6)
核心数据模型 - 迁移 - 向当前数据模型添加新属性/字段 - 无需重置模拟器或应用程序
步骤:
1)从编辑器创建模型版本 - 给它任何有意义的名称,如 ModelVersion2
2)转到该型号版本并对模型进行更改。
3)现在转到 YourProjectModel.xcdatamodeld 并将当前版本设置为新创建的版本。
4)添加以下代码以放置创建持久协调器的位置 -
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
并将选项值设置为方法的选项 -
[__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]
就我而言,它看起来像这样:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (__persistentStoreCoordinator != nil) {
return__persistentStoreCoordinator;
}
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"LGDataModel.sqlite"];
NSError *error = 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;
}
答案 1 :(得分:3)
您需要阅读Core Data versioning and migration。这是一篇很好地解释它的博客文章: