Созданный во время выполнения пользовательский NSManagedObjectModel для NSPersistentDocument
У меня есть приложение на основе документов (OS X), которое использует Core Data, поэтому документ является подклассом NSPersistentDocument. Когда пользователь создает документ, он / она указывает параметр, который определяет количество атрибутов, которые имеет конкретный объект в модели управляемого объекта. Например, сущность "Бейсбольная игра" может иметь от 4 до 9 атрибутов иннинга, в зависимости от того, сколько пользователь указывает при создании документа. В целях повышения эффективности модели управляемых объектов создаются при создании документа с объектами бейсбольной игры, содержащими точно указанное количество атрибутов иннинга. Поэтому документ с пятью подачами будет иметь другую модель управляемых объектов, чем документ с 9-ю подачами.
Чтобы динамически установить модель управляемого объекта, я должен переопределить -(id)managedObjectModel
в документе. Это тривиально, и я легко могу предоставить модель управляемого объекта с соответствующим количеством подач. Однако, если пользователь открывает сохраненный документ (с неизвестным количеством подач), меня снова просят передать документу его модель управляемого объекта через -(id)managedObjectModel
, Моя загадка, как я могу сказать документу, сколько иннинга у него есть, если я сам не знаю? Модель управляемого объекта создается и устанавливается во время выполнения, поэтому разумно сделать следующее: вставить в документ какое-то свойство, которое сообщает мне, сколько существует иннингов. Я думал о чем-то похожем на NSUserDefaults для каждого документа, но такого не существует. Единственный способ, о котором я могу думать, это хранить в хранилище любой объект / атрибут, который явно дает мне количество подач, но он не будет доступен, пока я не передам документу его модель управляемого объекта! Как правильно это сделать?
1 ответ
На самом деле у вас есть что-то вроде документа NSUserDefaults
когда вы используете Core Data, потому что файл постоянного хранилища может сохранять метаданные о файле. Эти метаданные могут быть чем угодно. Доступ к метаданным осуществляется через постоянный координатор хранилища. Я не использовал NSPersistentDocument
но если URL не совпадает с URL документа, похоже, что ваш подкласс может сделать что-то вроде self.managedObjectContext.persistentStoreCoordinator.persistentStores
чтобы добраться до нужного места.
Однако я добавлю, что это звучит как неправильный подход к вашей проблеме. У вас есть игровая сущность, которая относится к нескольким иннинговым инстансам. Почти в каждом случае правильным ответом будет отношение "многие-многие" от игры к иннингу, а не множественные независимые отношения иннинга. Дайте каждому иннингу целочисленный атрибут, называемый чем-то вроде inningNumber
чтобы вы знали, что есть что, и заставили логику вашего приложения ограничивать отношения диапазоном [4, 9]. Тогда вы получите все преимущества экономии места, которые вы ищете, при гораздо меньшей сложности. Плюс, если у игр когда-либо будет различное количество возможностей (дополнительные возможности?), Вы можете продолжать использовать ту же модель данных.