0

我有一个使用 Core Data 的基于文档的 (OS X) 应用程序,因此该文档是 NSPersistentDocument 的子类。当用户创建一个文档时,他/她指定一个设置来确定受管对象模型中特定实体具有的属性数量。例如,“棒球比赛”实体可以有 4 到 9 局属性,这取决于用户在创建文档时指定的数量。出于效率目的,托管对象模型是在文档创建时生成的,其中棒球比赛实体恰好包含指定的局数属性。因此,五局文档将具有与九局文档不同的管理对象模型。

要动态设置托管对象模型,我必须-(id)managedObjectModel在文档中覆盖。这是微不足道的,我可以轻松地提供具有适当数量的局数的托管对象模型。但是,如果用户打开一个保存的文档(局数未知),我再次被要求通过它为文档提供其托管对象模型-(id)managedObjectModel. 我的难题是,如果我不认识自己,我怎么能告诉文件它有多少局?托管对象模型是在运行时创建和设置的,因此明智的做法是在文档中添加某种属性,告诉我有多少局。我正在考虑基于每个文档类似于 NSUserDefaults 的东西,但不存在这样的东西。我能想到的唯一方法是存储任何明确给我局数的实体/属性,但在我给文档提供其托管对象模型之前,它是不可访问的!解决这个问题的正确方法是什么?

4

1 回答 1

2

事实上,当你使用 Core Data 时,你确实有类似每个文档的东西,因为持久存储文件可以保存有关文件的元数据。NSUserDefaults该元数据可以是您想要的任何内容。通过持久存储协调器访问元数据。我没有使用过NSPersistentDocument,但如果 URL 与文档 URL 不同,看起来你的子类可以做一些事情,比如self.managedObjectContext.persistentStoreCoordinator.persistentStores到达正确的位置。

但是,我要补充一点,这听起来像是解决您的问题的错误方法。您有一个与多个局数实例相关的游戏实体。几乎在每种情况下,正确的答案都是从比赛到局的一对多关系,而不是多个独立的局关系。给每一局一个整数属性,称为类似这样的东西,inningNumber以便您知道哪个是哪个,并使您的应用程序逻辑将关系限制在范围 [4, 9]。然后,您将以低得多的复杂性获得您正在寻找的所有空间节省优势。另外,如果游戏有不同的局数(额外局数?),您可以继续使用相同的数据模型。

于 2014-08-09T22:42:35.200 回答