Core data 如何为现有应用程序的新实体实施核心数据迁移(如果有必要)
我三天前刚刚发布了一个名为Twinstones的应用程序,我一直在不断更新它,但现在我希望更新我的核心数据模型对象。当用户第一次打开应用程序时(基本上每次都是如此),我使用Core data 如何为现有应用程序的新实体实施核心数据迁移(如果有必要),core-data,nsuserdefaults,database-migration,data-migration,Core Data,Nsuserdefaults,Database Migration,Data Migration,我三天前刚刚发布了一个名为Twinstones的应用程序,我一直在不断更新它,但现在我希望更新我的核心数据模型对象。当用户第一次打开应用程序时(基本上每次都是如此),我使用NSUserDefaults对象检查是否已对我的模型对象进行了初始设置。如果默认对象的值为0,则初始化设置;如果为1,则忽略设置 显然,在这一点上,下载游戏的70多人的初始设置已经完成 我想为第一个级别的教程添加一个实体,并使用核心数据跟踪教程是否已被查看,这意味着我必须使用新实体将现在的旧模型对象移植到此新模型对象。在开始之
NSUserDefaults
对象检查是否已对我的模型对象进行了初始设置。如果默认对象的值为0,则初始化设置;如果为1,则忽略设置
显然,在这一点上,下载游戏的70多人的初始设置已经完成
我想为第一个级别的教程添加一个实体,并使用核心数据跟踪教程是否已被查看,这意味着我必须使用新实体将现在的旧模型对象移植到此新模型对象。在开始之前,我是否应该使用另一个NSUserDefault
对象(以与初始设置相同的方式应用)来确定是否在第一级运行教程
如果没有,下面是我的托管对象上下文、托管对象模型和持久存储协调器代码:
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
// from website
- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"ScoreModel" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
// from website
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL *storeURL = [[self applicationDocumentsDirectory]
URLByAppendingPathComponent:@"Twinstones.sqlite"];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:nil
error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
在我的persistantStoreCoordinator
方法中,我将如何实现迁移?鉴于默认对象已经过初始化,我觉得我必须添加另一个默认对象,获取对当前模型对象的引用,迁移它并添加新实体
我以前从未真正这样做过,所以我会深入研究代码(如果,再次强调,这种迁移是必要的)。如果我可以使用另一个
NSUserDefaults
对象,几乎可以保证它存储数据的属性列表不会因意外而变得恶意,那么我将这样做。使用以下词典:
NSDictionary* configuration = @{
NSMigratePersistentStoresAutomaticallyOption : @YES,
NSInferMappingModelAutomaticallyOption:@YES
};
将存储添加到persistentStoreCoordinator
时的配置选项