Извлечение основных данных, но не дочерних - PullRequest
4 голосов
/ 18 ноября 2008

Скажем, у меня есть сущности, организованные в иерархии, где Parent является корневым объектом, а Child является подклассом Parent. Я хотел бы настроить NSArrayController для выборки только сущностей Parent, но не Child.

Если вы установите для имени объекта контроллера массива в Интерфейсном Разработчике значение Parent, оно извлекает все объекты Parent и Child. Первоначально я попытался установить предикат выборки контроллера массива в Интерфейсном Разработчике:

entity.name == "Parent"

Это работало для хранилища XML, но когда я переключился на хранилище SQLite, оно больше не работало. Я получаю следующую ошибку:

keypath entity.name not found in entity <NSSQLEntity xxx>

В качестве обходного пути я устанавливаю предикат фильтра (с тем же предикатом entity.name, что и выше) в моем awakeFromNib, чтобы фильтровать только родительские объекты. Очевидно, этот предикат действителен, когда объекты находятся в памяти, но вы не можете использовать его в предикате выборки с поддержкой SQL.

Есть ли способ извлечь только Parent сущности, но не Child сущности, используя предикат выборки, который работает с хранилищем SQLite? Кажется расточительным извлекать сущности, которые вы будете игнорировать только с помощью предиката фильтра.

Ответы [ 2 ]

7 голосов
/ 18 ноября 2008

Leopard ввел свойство includesSubentities в NSFetchRequest именно для этой цели. Вам придется создать подкласс NSObjectController или NSArrayController, чтобы предоставить запрос на выборку, который он будет использовать через свойство defaultFetchRequest, или изменить запрос на выборку, который он использует, переопределив его метод -fetchWithRequest:....

3 голосов
/ 20 ноября 2008

Я пытался использовать includesSubentities, но в итоге он не работал полностью. Оказывается, что изменения в подразделах приводят к тому, что содержимое контроллера массива обновляется без извлечения, если вы «автоматически подготавливаете содержимое», установленное в «Да», таким образом, обходя предикат выборочной выборки. Обратный след показывает, что setContent: вызывается в ответ на уведомления MOC.

Единственный способ сделать это надежно - использовать предикат фильтра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...