如何编辑从iOS5中的momd加载的NSManagedObjectModel

时间:2011-10-21 10:36:49

标签: ios core-data icloud

对于使用CoreData的iOS应用程序,我需要有一个模型,其中某些实体属性在应用程序的iPhone和iPad版本之间有所不同。 为此,我使用initWithContentsOfURL:从位于我的应用程序包中的momd文件加载NSManagedObjectModel。但是,在storeCoordinator实际使用模型之前,我在模型中以编程方式修改了一些实体(基于我存储在特定于设备的plist中的信息)。 这曾经在iOS4上完美运行。正如Apple在其文档中所述,

  

托管对象模型是可编辑的,直到它们被对象图管理器(托管对象上下文或持久性存储协调器)使用。

在iOS5中似乎不再是这种情况(尽管文档仍然说明了这一点)。一旦使用initWithContentsOfURL创建了模型:例如,任何修改尝试都会抛出'NSInternalInconsistencyException',原因是:'无法修改不可变模型'。如果我在调试器创建后立即打印模型对象的描述,它会读取'isEditable 0',其中在iOS4上运行相同的代码时,它们会读取'isEditable 1'。

在模型上使用“复制”,按Apple建议创建可编辑副本也会返回“isEditable 0”的模型。

我看到两个可能的解释:

  • Bug。我在openradar上找不到匹配的bug报告,如果需要我会提交一个。
  • iCloud集成。我对iCloud API还不是很熟悉,但我知道可以设置与CoreData的某种集成。我想也许一些自动协调器可以在创建时访问我的模型,使其无法编辑。

我将继续深入研究这些选项,但如果有人有这方面的经验,我们将不胜感激。

2 个答案:

答案 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下修改模型文件。