【问题标题】:Core Data Relationship Designing - Load only desired entity核心数据关系设计 - 仅加载所需的实体
【发布时间】:2015-02-17 23:58:36
【问题描述】:

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

即:

我有 2 个实体,分别称为 Verse 和 Translation。 Verse 与翻译表是一对多的关系。 翻译表包含 EN、DE、AR 等不同语言的翻译。

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

但我只想加载每个诗句的所需翻译。例如只有英文。

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

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

感谢您的任何建议。

问候,

【问题讨论】:

    标签: xcode core-data database-design


    【解决方案1】:

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

    【讨论】:

    • 谢谢,您的回答让我找到了filteredSetUsingPredicate,也许这对我也有帮助,我正在查看它并出错。正如我所说,我想要做的是,当我从核心数据中加载所有 Verses 时,我会过滤翻译并只获取特定的翻译。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多