我一直在用 coredata 解决这个问题,它让我发疯,因为它应该是直截了当的
我目前正在开发这个应用程序的第一个版本,显然我一直在这里和那里调整核心数据模型,
但是,每次更改核心数据模型时,我都需要卸载应用程序并重新安装新版本。
这只是我自己还可以接受,但一旦发布,我需要能够在不重新安装用户的情况下更改更新应用程序。
我错过了什么,
是否需要编写一些代码来告诉核心数据如何将现有的持久数据修改为新的?
感谢您的帮助
杰森
我一直在用 coredata 解决这个问题,它让我发疯,因为它应该是直截了当的
我目前正在开发这个应用程序的第一个版本,显然我一直在这里和那里调整核心数据模型,
但是,每次更改核心数据模型时,我都需要卸载应用程序并重新安装新版本。
这只是我自己还可以接受,但一旦发布,我需要能够在不重新安装用户的情况下更改更新应用程序。
我错过了什么,
是否需要编写一些代码来告诉核心数据如何将现有的持久数据修改为新的?
感谢您的帮助
杰森
核心数据模型 - 迁移 - 向当前数据模型添加新属性/字段 - 无需重置模拟器或应用程序
脚步:
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;
}
您需要阅读Core Data 版本控制和迁移。这是一篇很好地解释它的博客文章: