在使用coredata后,如果添加了字段程序需要升级那么如果不设置coredata的数据迁移,升级后的app会直接崩溃
下来来看怎么设置coredata的轻量迁移(我的是xcode4.3.2)
1.选中mom文件选择菜单editor->Add Model Version
添加一个新的版本
2.选择最上层.xcdatamodeld文件,在属性栏找到versioned core data model,设置添加的version为当前用的
3,修改下面的代码
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (persistentStoreCoordinator != nil)
{
returnpersistentStoreCoordinator;
}
NSURL *storeUrl = [NSURLfileURLWithPath: [[selfapplicationDocumentsDirectory]stringByAppendingPathComponent: @"Demo.sqlite"]];
// handle db upgrade 迁移
NSDictionary *options = [NSDictionarydictionaryWithObjectsAndKeys:
[NSNumbernumberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumbernumberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinatoralloc]initWithManagedObjectModel: [selfmanagedObjectModel]];
if (![persistentStoreCoordinatoraddPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:storeUrl options:options error:&error])
{
NSLog(@"failed to add persistent store with type to persistent store coordinator");
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
returnpersistentStoreCoordinator;
}
4.在新数据模型的文件上添加字段,记得在类文件里也要添加上你添加的新字段,可以删除原来的类文件,重新生成manageobject类。
5。选中.xcmappingmodel文件,点击editor->update default mapping,或refresh
到这里如果你再运行app没问题,那应该就迁移成功了,要是这样就很容易了,关键是很多时候会出一些问题
下面记录一下我碰到的问题,搞了一个下午才找到症结,我的问题的情况和这个地放描述的问题一样
错到
-(NSPersistentStoreCoordinator*)persistentStoreCoordinator
{
}
这个里面。报的错误是
"Error Domain=NSCocoaErrorDomain Code=1570 "The operation couldnU2019t be completed. (Cocoa error 1570.)" UserInfo=0x7b5890 {NSValidationErrorObject=<NSManagedObject: 0x7c65b0> (entity: Profile; id: 0x702df0 <x-coredata://B65DFAF9-47BA-4477-85BB-3C3C8FD6F4A7/Profile/p502> ; data: <fault>), NSValidationErrorKey=toUser, NSLocalizedDescription=The operation couldnU2019t be completed. (Cocoa error 1570.)}",
仔细看这个提示,先看到错误是在 表Profile里面,接下来看key,是toUser到coredata里面的profile表我们找到toUser这个relationship,发现它的optional选项没勾上,打上勾搞定。
一个小问题,但是使app产生的结果就是直接crash。
话说coredata真是个麻烦的东西。