использовать NSPredicate для удаления связей ToMany на coredata - PullRequest
0 голосов
/ 03 марта 2011

У меня есть таблица coredata со списком из 32 языков. Каждый язык имеет отношение один-ко-многим с переводами, которое содержит 32 перевода соответствующего языка.

Например, английский будет:

Language.code = @"EN";
//english translation
Language.Translation.code = @"EN";
Language.Translation.text = @"english";
//italian translation
Language.Translation.code = @"IT";
Language.Translation.text = @"inglese";
...

Конец французского будет:

Language.code = @"FR";
//english translation
Language.Translation.code = @"EN";
Language.Translation.text = @"french";
//italian translation
Language.Translation.code = @"IT";
Language.Translation.text = @"francese";
...

И так далее, чтобы сформировать матрицу 32x32.

Я использую это в своем приложении, но в какой-то момент мне нужно показать табличное представление с каждым языком на его собственном, скажем, идиоме (английский, французский, итальянский, испанский, 日本人, ...). Для этого я использовал обычный NSFetchRequest, а затем в tableView cellForRowAtIndexPath: я запускаю NSPredicate, например:

@"Language.code = Language.Translation.code"

В результате вы теряете много памяти, поэтому мне было интересно, есть ли способ убрать 31 перевод в отношениях, которые я не использую, пока выполняю NSFetchRequest. Я попробовал что-то вроде:

@"ANY LangTranslations.translationCode = code"

но это не раздевание, это просто проверка! Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 03 марта 2011

Похоже, у вас есть модель данных, похожая на эту:

Language{
    code:string
    translations<-->>Translation.language
}

Translation{
    code:string
    text:string
    language<<-->Language.translations
}

Если у вас уже есть объект Language, вам не нужно извлекать связанные Translation объекты, которые у вас есть.ходить отношения.Для любого конкретного объекта Language значение translations вернет NSSet всех связанных переводов.Когда у вас есть набор, вы можете отсортировать его в массив для отображения в виде таблицы.

Обновление:

Из комментария:

Basically I would like to retrieve each Language object with only one translation out of the 32 it has.

Базовые данные не работают так.Выборка возвращает экземпляры одной сущности, а затем вы проходите отношения этих сущностей, чтобы найти другие экземпляры связанных сущностей.Тем не менее, вы должны четко понимать, какой объект вы действительно хотите.В этом случае вам нужен объект Language с определенными объектами Translations или вам нужен объект Translations с конкретным объектом Language?

Если первый, первый шагчтобы получить нужный объект Language с предикатом:

NSPredicate *p=[NSPredicate predicateWithFormat:@"code=%@",languageCode];

..., который даст вам английский Language объект.Затем вы просто запрашиваете Language для соответствующего Translation объекта:

NSPredicate *p=[NSPredicate predicateWithFormat:@"code=%@",languageCode];
Translation *t=[[aLanguageObj.translations filteredSetUsingPredicate:p] anyObject];

Если вам приходится много делать, и у вас есть подклассы NSManagedObject для Language и Translation, вы можете деформироватьсяпредыдущий код в методе класса Language, который обрабатывает это для вас:

-(Translation *) translationForCode:(NSString *) languageCode; 

... и использует его следующим образом:

cell.textLabel.text=[[aLanguageObj translationForCode:languageCode].text];

Если вы хотитеTranslation объект, связанный с конкретным Language объектом, тогда вы будете запускать выборку для объекта Translation с предикатом вроде:

NSPredicate *p=[NSPredicate predicateWithFormat:@"code==%@ AND langauge.text==%@",codeForTranslation,languageCode];
...