使用NSPredicate去除核心数据上的许多关系

时间:2011-03-03 17:30:00

标签: core-data one-to-many nspredicate

我有一个带有32种语言列表的coredata表。每种语言都与翻译有一对多的关系,其中包含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的矩阵。

我通过我的应用程序使用它,但在某些时候我需要用他自己的语言(英语,法语,意大利语,西班牙语,日本人,......)显示每种语言的tableview。 要做到这一点,我确实使用了通常的NSFetchRequest,然后使用tableview cellForRowAtIndexPath:我运行NSPredicate,如:

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

结果是内存浪费,所以我想知道是否有办法在我执行NSFetchRequest时删除我不使用的关系中的31个翻译。 我尝试过类似的东西:

@"ANY LangTranslations.translationCode = code"

但这不是剥离,只是检查! 有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

听起来你有一个像这样的数据模型:

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

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

如果您已经拥有Language对象,那么您不必获取相关的Translation对象。对于任何特定的Language对象,translations的值将返回所有相关翻译的NSSet。获得该集后,您可以将其排序为数组以在tableview中显示。

更新

来自评论:

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

核心数据不能像那样工作。 fetch返回一个实体的实例,然后您走这些实体关系以查找相关实体的其他实例。但是,您需要明确您真正想要的对象。在这种情况下,您是否希望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];

如果你必须做很多事情而且你有LanguageTranslation的NSManagedObject子类,你可以在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];