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

标签 ios core-data icloud

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

Managed object models are editable until they are used by an object graph manager (a managed object context or a persistent store coordinator).

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

按照 Apple 的建议,在模型上使用“copy”创建一个可编辑的副本,也会返回一个带有“isEditable 0”的模型。

我看到了两个可能的解释:

  • 错误。我在 openradar 上找不到匹配的错误报告,如有必要,我会提交一份。
  • iCloud 集成。我还不太熟悉 iCloud API,但我知道可以设置与 CoreData 的某种集成。我想也许某些自动协调器可以在创建模型时访问我的模型,使其不可编辑。

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

最佳答案

这是一个错误或未记录的更改。我运行了这个测试代码:

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

关于ios - 如何编辑从 iOS5 中的 momd 加载的 NSManagedObjectModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7848237/

相关文章:

ios - 如何在 XCTestCase 中禁用 "All exceptions"

ios - 无法将 CGPoint 分配给 CLLocationCooperative2D

iphone - 单击后表格单元格变为空白

ios - 核心数据性能 : predicate on more to-many relationships

关闭模态后 iOS TableView 重新加载

ios - NSUbiquitousKeyValueStoreDidChangeExternallyNotification 未通过临时分发触发

objective-c - 获取当前的 iCloud 同步状态

ios - 在 Swift 中将数组发布到 firebase 数据库

cocoa - NSFetchedResultsController 缓存再次不匹配

ios - iCloud 共享 : "You need a newer version of App to open this but the required version couldn' t be found in the App Store. ”