Core data 运行时为NSPersistentDocument生成的自定义NSManagedObjectModel

Core data 运行时为NSPersistentDocument生成的自定义NSManagedObjectModel,core-data,nspersistentdocument,nsmanagedobjectmodel,Core Data,Nspersistentdocument,Nsmanagedobjectmodel,我有一个基于文档(OS X)的应用程序,它使用核心数据,因此该文档是NSPersistentDocument的一个子类。当用户创建文档时,他/她指定一个设置,该设置确定托管对象模型中特定实体具有的属性数。例如,“棒球比赛”实体可以具有4到9局属性,具体取决于用户在创建文档时指定的属性数量。为了提高效率,托管对象模型是在文档创建时生成的,其中棒球比赛实体正好包含指定的局数属性。因此,五局文档与九局文档具有不同的托管对象模型 要动态设置托管对象模型,我必须覆盖文档中的-(id)managedObje

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


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

事实上,在使用核心数据时,您确实有类似于每个文档的
NSUserDefaults
,因为持久存储文件可以保存有关该文件的元数据。元数据可以是您想要的任何内容。通过持久存储协调器访问元数据。我没有使用过
NSPersistentDocument
,但是如果URL与文档URL不相同,那么您的子类似乎可以执行类似于
self.managedObjectContext.persistentstorecordinator.persistentStores
的操作来找到正确的位置

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