Core data UIManagedDocument迁移数据模型
我正在开发一款iPhone应用程序,它使用Core data UIManagedDocument迁移数据模型,core-data,migration,icloud,uimanageddocument,Core Data,Migration,Icloud,Uimanageddocument,我正在开发一款iPhone应用程序,它使用UIManagedDocument的子类,并将其文档存储在iCloud上 在我改变了我的核心数据模型/方案(添加了一个新的模型版本——就像我在过去几周中多次做的那样)之前,一切都很好。 我添加了一个新属性,并更改了其中一个现有属性的数据类型 现在,当我运行我的应用程序时,我似乎无法使用UIManagedDocument的-openWithCompletionHandler:加载我的文档。 我可以创建新文档并读/写这些文档。 如果我将数据模型版本更改回1,
UIManagedDocument
的子类,并将其文档存储在iCloud上
在我改变了我的核心数据模型/方案(添加了一个新的模型版本——就像我在过去几周中多次做的那样)之前,一切都很好。
我添加了一个新属性,并更改了其中一个现有属性的数据类型
现在,当我运行我的应用程序时,我似乎无法使用UIManagedDocument
的-openWithCompletionHandler:
加载我的文档。
我可以创建新文档并读/写这些文档。
如果我将数据模型版本更改回1,那么我可以读取现有文档,但不能读取新文档
据我所知,我只做到数据模型的轻量级迁移,而UIManagedDocument
应该能够正确处理这个问题吗
任何建议都将不胜感激 在UIManagedDocument的子类中,您可能希望尝试覆盖managedObjectModel,如下所示:
- (NSManagedObjectModel *)managedObjectModel
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"<ModelNameHere>" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
return managedObjectModel;
}
-(NSManagedObjectModel*)managedObjectModel
{
NSString*path=[[NSBundle mainBundle]pathForResource:@“momd”类型的@”;
NSURL*momURL=[NSURL fileURLWithPath:path];
NSManagedObjectModel*managedObjectModel=[[NSManagedObjectModel alloc]initWithContentsOfURL:momURL];
回归模型;
}
以下内容基于我的理解:
注意-我没有在iCloud上试用过,但我已经在非iCloud上试用过,看起来还可以。
UIManagedDocument
自行配置managedObjectModel
和持久存储协调器
当需要进行迁移时,只需设置UIManagedDocument
的persistentStoreOptions
//Note - In this example, managedDocument is a UIManagedDocument property
self.managedDocument.persistentStoreOptions = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
参考:
self.database=[[UIManagedDocumentAlloc]initWithFileURL:url]之后代码>但我的迁移似乎没有成功。请检查我的答案中提供的苹果文档链接,文档解释了所有需要的步骤。我在AppDelegate的-(BOOL)应用程序中使用了上述代码:(UIApplication*)应用程序使用选项完成了启动:(NSDictionary*)启动选项
@user1046037真棒!这对我来说很有效,节省了我很多时间。这绝对是正确的答案。上面的一个很难理解,可能会导致应用程序使用不同的型号。