Предикаты основных данных с подклассами NSManagedObjects

У меня есть АУДИО класс. Это аудио имеет подкласс SOUND_A и подкласс SOUND_B. Все сделано правильно и работает нормально.

У меня есть другая модель, назовем ее PLAYLIST_JOIN, и она может содержать (в реальном мире) SOUND_A и SOUND_B, поэтому мы даем ей отношение AUDIO и PLAYLIST.

Все это работает в приложении.

Проблема, с которой я сталкиваюсь сейчас, заключается в запросе таблицы PLAYLIST_JOIN с помощью NSPredicate. Что я хочу сделать, так это найти точный элемент PLAYLIST_JOIN, предоставив ему 2 ключа в предикате

sound_a._sound_a_id = %@ && playlist.playlist_id = %@

и

sound_b.sound_b_id = %@ && playlist.playlist_id = %@

Основная проблема заключается в том, что поскольку таблица хранит не sound_a и sound_b, а хранит audio, я не могу использовать этот синтаксис. У меня нет возможности реорганизовать sound_a и sound_b, чтобы использовать одно и то же имя атрибута _id, так как мне это сделать?

Могу ли я передать метод предикату? что-то вроде этого:

[audio getID] = %@ && playlist_id = %@


person coneybeare    schedule 07.05.2010    source источник
comment
Почему у вас нет возможности использовать тот же атрибут _id? Сущность AUDIO должна иметь атрибут _id, который должны наследовать SOUND_A и SOUND_B.   -  person Yuji    schedule 07.05.2010
comment
Я не хочу вдаваться в подробности, но id ссылается на удаленные таблицы, которые не совпадают. Я мог бы обернуть его в оператор if вокруг предиката, но это сделало бы мою жизнь намного проще, если бы был способ сделать это, как последний блок кода в моем вопросе.   -  person coneybeare    schedule 07.05.2010


Ответы (1)


Это становится немного сложнее, но вам нужно добавить третье условие к предикату:

(entity.name = sound_a && _sound_a_id = %@ && playlist.playlist_id = %@) && (entity.name = sound_b && sound_b_id = %@ && playlist.playlist_id = %@)

Это предполагает, что вы запрашиваете абстрактное аудио и говорите ему возвращать подклассы. Поскольку условие проверяется слева направо, если первое условие не выполняется, оно будет двигаться дальше и не будет выдавать ошибки, потому что _sound_a_id не существует.

Первое условие ссылается на NSEntityDescription, который является частью NSManagedObject, а его атрибут name является просто строкой.

person Marcus S. Zarra    schedule 07.05.2010
comment
Спасибо, Маркус. Кстати, сначала я посмотрел в вашей книге ответ :) Разве это не должно быть || в середине 2? - person coneybeare; 07.05.2010
comment
До вас, я не знаю вашей точной логики :) У вас был && в исходном вопросе. - person Marcus S. Zarra; 07.05.2010