对于使用CoreData的iOS应用程序,我需要有一个模型,其中某些实体属性在应用程序的iPhone和iPad版本之间有所不同。 为此,我使用initWithContentsOfURL:从位于我的应用程序包中的momd文件加载NSManagedObjectModel。但是,在storeCoordinator实际使用模型之前,我在模型中以编程方式修改了一些实体(基于我存储在特定于设备的plist中的信息)。 这曾经在iOS4上完美运行。正如Apple在其文档中所述,
托管对象模型是可编辑的,直到它们被对象图管理器(托管对象上下文或持久性存储协调器)使用。
在iOS5中似乎不再是这种情况(尽管文档仍然说明了这一点)。一旦使用initWithContentsOfURL创建了模型:例如,任何修改尝试都会抛出'NSInternalInconsistencyException',原因是:'无法修改不可变模型'。如果我在调试器创建后立即打印模型对象的描述,它会读取'isEditable 0',其中在iOS4上运行相同的代码时,它们会读取'isEditable 1'。
在模型上使用“复制”,按Apple建议创建可编辑副本也会返回“isEditable 0”的模型。
我看到两个可能的解释:
我将继续深入研究这些选项,但如果有人有这方面的经验,我们将不胜感激。
答案 0 :(得分:3)
我于10月5日就这个问题提出了一个雷达,今天收到了以下回复:
您可以通过在NSManagedObjectModel实例上调用-mutableCopy来获取模型的可变副本。
这适用于iOS 5模拟器,我还没有在设备上测试过。没有自己尝试,因为NSManagedObjectModel不符合NSMutableCopying(根据文档),并且头文件没有提到 - (id)mutableCopy。
我在10月份通过将momd文件中的一个与一个空的NSManagedObjectModel合并来创建一个新的NSManagedObjectModel来解决它。我认为来自momd文件的模型现在是内部不可变的,但其他的(来自复制或合并)实际上是可变的。
答案 1 :(得分:2)
这是一个错误或无证的更改。我运行了这个测试代码:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TestManageObjectModelEdits" withExtension:@"momd"];
NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSEntityDescription *e=[[NSEntityDescription alloc] init];
[e setName:@"PEntity"];
NSArray *a=[mom entities];
NSArray *b=[a arrayByAddingObject:e];
[mom setEntities:b];
NSLog(@"mom = %@",mom);
...在iOS 4.3和5.0下。它工作在4.3下并抛出一个错误,说它无法在5.0下修改模型文件。