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

Core Data Relationship Designing - Load only desired entity

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

即:

我有 2 个实体,分别叫做 Verse 和 Translation。 Verse 与翻译是一对多的关系 table。 翻译 table 包含不同语言的翻译,例如 EN、DE、AR。

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

但我只想加载每节的所需翻译。例如只有 EN.

因为如果我加载 1000 节并使用 5 种不同的翻译(DE、EN、TR、AR、FR),那么我有大量数据需要避免 >> 1000x5 = 5000。

我不想每次都加载我不需要的翻译。仅选择的翻译。

感谢您的任何建议。

此致,

核心数据会做一些叫做错误的事情,它应该只加载你实际要求的数据。它可能会为所有这些对象加载一些元数据,但在您请求之前它不会真正加载翻译。如果您想了解更多信息,我建议您多研究故障,因为它看起来相当复杂。至少其余的故障看起来很复杂。

我找到了一个解决方案,这正是我想要的。我进行了测试,它 returns 只有所需的翻译。

- (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;
}