我的iOS应用程序中存在CoreData性能问题。
我需要使用subquery子句执行查询。
让我们解释一下情况。
我有一个名为quota的实体,它具有groupCode和date属性。 (有更多属性,但暂时不导入)。
要执行我的搜索,需要两个步骤:
例:
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
都会导致额外的获取,这本身是昂贵的,但是构建和解析关联谓词的成本也很高。您可以通过更改谓词一次执行所有提取来避免这种情况。请注意,要重现与当前代码相同的行为,以相反的顺序执行提取会更容易:
(这样做的原因与重复项有关。如果从第一次获取起有多个配额,且所有配额都具有相同的日期,则中间数组将包含具有相同日期的重复项。但是第二次获取中的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/