我有一个带有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"
但这不是剥离,只是检查! 有没有更好的方法呢?
答案 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];
如果你必须做很多事情而且你有Language
和Translation
的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];