核心数据关系设计 - 仅加载所需的实体

时间:2015-02-16 14:17:04

标签: xcode core-data database-design

我需要帮助使用Core Data为我的应用程序设计数据库。

即:

我有2个名为Verse和Translation的Entites。 Verse与翻译表有一对多的关系。 翻译表包含不同语言的翻译,例如EN,DE,AR。

我知道如果我加载Verse表,那么相应的翻译也会延迟加载。

但我想加载每首诗歌所需的翻译。例如,只有EN。

因为如果我加载了1000个Verse并且有5个不同的翻译(DE,EN,TR,AR,FR),那么我有大量的数据我想避免>> 1000x5 = 5000.

我不想每次都加载我不需要的翻译。只有选定的翻译。

感谢您的任何建议。

此致

2 个答案:

答案 0 :(得分:0)

核心数据执行称为错误的操作,它应该只加载您实际要求的数据。它可能会为所有这些对象加载一些元数据,但在您提出要求之前,它实际上不会加载转换。如果你想了解更多,我会建议更多地考虑错误,因为它似乎相当复杂。至少故障的其余部分似乎很复杂。

答案 1 :(得分:0)

我找到了一个正是我想要的解决方案。我测试过,它只返回所需的翻译。

- (NSArray *) loadAllVersesByLanguage
{
    NSManagedObjectContext *_managedObjectContext = [self managedObjectContext];
    NSArray *fetchedObjects;
    NSString *turkish = @"TR";//should be parameterized
    NSString *arabic = @"AR";

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"languageCode==%@ OR languageCode==%@",turkish,arabic];

    NSFetchRequest *fetch = [[NSFetchRequest alloc] initWithEntityName:@"Verse"];

    NSError * error = nil;
    fetchedObjects = [_managedObjectContext executeFetchRequest:fetch error:&error];

    if(fetchedObjects != nil && fetchedObjects.count > 0 ){
        for(Verse *verse in fetchedObjects){
            NSSet *verseSet = [verse.translations filteredSetUsingPredicate:pred];
            [verse.translations setSet:verseSet];
        }
        return fetchedObjects;
    }else{
        return nil;
    }

    return nil;
}