我的iOS应用程序中存在CoreData性能问题。

我需要使用subquery子句执行查询。

让我们解释一下情况。

我有一个名为quota的实体,它具有groupCode和date属性。 (有更多属性,但暂时不导入)。

要执行我的搜索,需要两个步骤:

  • 首先,我需要选择groupCode等于quotaGroupProductProductParam(quotaGroupProductParam是变量。对于本例quotaGroupProductParam = 6816)的所有配额项目。
  • 最后,对于每个结果,我需要在与子句date = result.date和groupCode = quotaGroupParam(quotaGroupParam是一个变量。对于此示例quotaGroupParam = 58)相同的实体中执行新搜索。

  • 例:
    NSArray *quotasGroupProduct = [[DBContext shared] executeFetchRequest:@"Quota" WithFilter:[NSPredicate predicateWithFormat:@"groupCode=%@", quotaGroupProductParam]];
    for (Quota *quota in quotasGroupProduct) {
        NSArray *quotasGroup = [[DBContext shared] executeFetchRequest:@"Quota" WithFilter:[NSPredicate predicateWithFormat:@"groupCode = %@ AND date = %@", quotaGroupParam, quota.date]];
        if([quotasGroup count] > 0 && [quotasRepresentative count] > 0) {
            [quotaDatesArray addObject:quota.date];
        }
    }
    

    我想更改此代码以仅执行一个fetchRequest。

    在执行此操作的SQL查询下面:
    select * from zquota q where zgroupCode = 58 and exists (select 1 from zquota where ZgroupCode = 6816 and zdate = q.zdate);
    

    有人可以帮助我吗?

    谢谢!

    最佳答案

    当前,quota数组中的每个quotasGroupProduct都会导致额外的获取,这本身是昂贵的,但是构建和解析关联谓词的成本也很高。您可以通过更改谓词一次执行所有提取来避免这种情况。请注意,要重现与当前代码相同的行为,以相反的顺序执行提取会更容易:

  • 使用groupCode = quotaGroupParam获取所有配额。
  • 将日期提取到数组中。
  • 使用groupCode = quotaGroupProductParam并使用上述日期数组中的日期获取所有配额。
  • 将日期提取到最终数组中。

  • (这样做的原因与重复项有关。如果从第一次获取起有多个配额,且所有配额都具有相同的日期,则中间数组将包含具有相同日期的重复项。但是第二次获取中的IN子句将确保仅包含其中一个在最后一个数组中。)
    NSArray *quotasGroup = [[DBContext shared] executeFetchRequest:@"Quota" WithFilter:[NSPredicate predicateWithFormat:@"groupCode=%@", quotaGroupParam]];
    // extract the dates...
    NSArray *datesOfInterest = [quotasGroup valueForKey:@"date"];
    // execute the second fetch
    NSArray *quotasGroupProduct = [[DBContext shared] executeFetchRequest:@"Quota" WithFilter:[NSPredicate predicateWithFormat:@"groupCode = %@ AND date IN %@", quotaGroupProductParam, datesOfInterest]];
    // extract the dates again
    NSArray *finalDatesArray = [quotasGroupProduct valueForKey:@"date"];
    if ([quotasRepresentative count] > 0) {
            [quotaDatesArray addObjectsFromArray:finalDatesArray];
    }
    

    因此,无论有多少项目与您的谓词匹配,都只需要两次访存。我希望这会给您所需的性能提升。

    关于ios - iOS CoreData上的子查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42724314/

    10-10 02:16