我有一个广泛使用CoreData API的应用程序.我正在开发一个更新版本,为实体添加一些字段.由于架构更改,我的应用程序在加载时崩溃(除非我吹掉私有存储并重新启动).
问题是当客户升级到新版本时,我不介意在第一次加载应用程序时对其数据运行升级程序,但我甚至无法加载它,因为CoreData不喜欢架构更改.
有没有办法告诉CoreData"它确定..不要担心架构更改"?因为我只添加了字段而没有重命名或删除任何内容.
我有一个使用Core Data进行存储的iPhone应用程序.我已经成功部署了它,现在我正在开发第二个版本.我遇到了数据模型的问题,在持久性存储升级时需要一些非常简单的数据转换,所以我不能只使用默认的推断映射模型.
我的对象模型存储在.xcdatamodeld包中,版本1.0和1.1彼此相邻.版本1.1设置为活动版本.当我使用默认迁移行为并将NSInferMappingModelAutomaticallyOption设置为YES时,一切正常.我的sqlite存储从模型的1.0版本升级,一切都很好,当然,除了我需要做的少量转换.
作为额外的实验步骤,我向核心数据模型包添加了一个新的映射模型,并且没有对xcode生成的内容进行任何更改.当我运行我的应用程序(使用旧版本的数据存储)时,我得到以下内容
* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Object's persistent store is not reachable from this NSManagedObjectContext's coordinator'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?这是我获取托管对象模型和持久性存储协调器的代码.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"gti_store.sqlite"]];
NSError *error;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeUrl
options:options
error:&error]) {
NSLog(@"Eror creating persistent store coodinator - %@", …Run Code Online (Sandbox Code Playgroud) 在我的 CoreData 模型中,我创建了一个抽象实体 ( IDManagedObject) 来共享其他实体的公共属性。
当我第一次运行它时,我遇到了几个Cannot merge multiple root entity source tables into one destination entity root table错误。
完整错误如下:
Fatal error: Unresolved error Error Domain=NSCocoaErrorDomain Code=134110 "An error occurred during persistent store migration." UserInfo={sourceURL=file:///Users/koen/Library/Developer/CoreSimulator/Devices/8E2C0F01-ABF3-4414-A01A-EE4FFEF8D187/data/Containers/Data/Application/B7A9A4EE-EB57-434F-B1A9-576DCD80CFBD/Library/Application%20Support/MyApp.sqlite, reason=Cannot migrate store in-place: Cannot merge multiple root entity source tables into one destination entity root table, destinationURL=file:///Users/koen/Library/Developer/CoreSimulator/Devices/8E2C0F01-ABF3-4414-A01A-EE4FFEF8D187/data/Containers/Data/Application/B7A9A4EE-EB57-434F-B1A9-576DCD80CFBD/Library/Application%20Support/MyApp.sqlite, NSUnderlyingError=0x6000019fb810 {Error Domain=NSCocoaErrorDomain Code=134110 "An error occurred during persistent store migration." UserInfo={message=Cannot merge multiple root entity source tables into one destination entity root table, …Run Code Online (Sandbox Code Playgroud) My Core Data模型包含一个实体Shape,它有两个自引用关系,这意味着四个属性.一对是一对多关系(Shape.containedBy < - >> Shape.contains),另一对是多对多关系(Shape.nextShapes << - >> Shape.previousShapes).这一切都在应用程序中完美运行,因此我不认为自引用关系通常是一个问题.
但是,在将模型迁移到新版本时,Xcode无法编译自动生成的映射模型,并显示以下错误消息:
2009-10-30 17:10:09.387 mapc[18619:607] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "FUNCTION($manager ,'destinationInstancesForSourceRelationshipNamed:sourceInstances:' , 'contains' , $source.contains) == 1"'
*** Call stack at first throw:
(
0 CoreFoundation 0x00007fff80d735a4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x00007fff83f0a313 objc_exception_throw + 45
2 Foundation 0x00007fff819bc8d4 _qfqp2_performParsing + 8412
3 Foundation 0x00007fff819ba79d +[NSPredicate predicateWithFormat:arguments:] + 59
4 Foundation 0x00007fff81a482ef +[NSExpression expressionWithFormat:arguments:] + 68
5 Foundation 0x00007fff81a48843 …Run Code Online (Sandbox Code Playgroud) cocoa core-data core-data-migration self-reference mapping-model