Филтрирайте деца, а не родители на Coredata за връзка

Опитвам се да филтрирам детето на връзката в coredata, но проблемът е, че Coredata филтрира по родител и това е правилно, но не филтрира децата.

Модел:

Volumen <-->> MusicScore

Искам да филтрирам редовете с музикален резултат по обем.

Моят NSPredicate е, че:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(relation_music_score, $musicscore, ANY $musicscore.nameMusicScore CONTAINS[cd] %@).@count > 0", searchStr];

self.collectionVolumen = [BOIVolumen MR_findAllWithPredicate:predicate];

CoreData ми дава всички томове, които съдържат името на търсената музикална партитура, но искам всички томове с търсена само музикална партитура, а не цялата музикална партитура.

Пример:

Volumens
  name = "One",
  etc..
  relation_music_score = NSOrderedSet

     Music Score (1)
       name = "One"

     Music Score (2)
       name = "two"

Volumens
  name = "Two",
  etc..
  relation_music_score = NSOrderedSet

     Music Score (3)
       name = "three"

     Music Score (4)
        name = "four"

Когато търся музикален резултат с име "two", искам този резултат:

Volumens
  name = "One",
  etc..
  relation_music_score = NSOrderedSet

Music Score (2)
  name = "two"

И предишният NSPredicate ме получи:

Volumens
  name = "One",
  etc..
  relation_music_score = NSOrderedSet

Music Score (1)
  name = "One"

Music Score (2)
  name = "two"

РЕДАКТИРАНЕ:

Опитвам се да филтрирам връзката с този предикат и код:

  for (int i = 0; i < [self.collectionVolumen count]; i++) {
        BOIVolumen *volumen = [self.collectionVolumen objectAtIndex:i];
        NSOrderedSet *musicStore = [[self.collectionVolumen objectAtIndex:i] relation_music_score];

        NSPredicate *filterMusicScore = [NSPredicate predicateWithFormat:@"nameMusicScore CONTAINS[cd] %@", searchStr];
        NSOrderedSet *musicStoreTemporal = [musicStore filteredOrderedSetUsingPredicate:filterMusicScore];

        volumen.relation_music_score = musicStoreTemporal;
    }

и винаги получавам тази грешка Лявата страна за оператор ALL или ANY трябва да бъде или NSArray, или NSSet. Намерих и не намерих нищо.


person joselufo    schedule 26.12.2014    source източник


Отговори (1)


Вашият предикат, макар и прекалено сложен, работи. Получавате правилния избор от Volumen обекти. Намереният екземпляр, разбира се, все още има всички налични връзки, така че имате два избора:

  • Или филтрирате връзките отново, напр. с filteredSetUsingPredicate:,
  • или извличате MusicScore обекти на първо място, а не Volumen обекти.

Мисля, че вторият вариант е това, което искате.

person Mundi    schedule 26.12.2014
comment
Благодаря Mundi, опитвам се да филтрирам връзката, но винаги получавам същата грешка и не знам какво се случва. Ще редактирам публикацията си, за да ви покажа. Благодаря отново. - person joselufo; 26.12.2014