复杂核心数据查询需要帮助

Posted

技术标签:

【中文标题】复杂核心数据查询需要帮助【英文标题】:Needed help for complex core data query 【发布时间】:2014-12-16 08:09:48 【问题描述】:

我有一个名为 UserProfile 的表,如下所述

我需要不同的位置,对不同的位置进行计数,对用户 = user1 在不同位置的值为 0 的状态进行计数。状态值可以在 0 t0 5(number) 之间

所以输出将是

abc 3 2
abd 1 1

在哪里 abc 是唯一位置,3 是表中 abc 的总计数,2 是位置 abc 的状态 =0 的总计数

【问题讨论】:

状态是数字还是文本?它可以取什么值? 为您的条件设置谓词(例如 status=0 和 user=user1 以及其他任何内容)。要获取按不同位置分组的输出,您可以使用setPropertiesToGroupBy。玩一点。也可以看setPropertiesToFetch @pdasdf 状态是一个数字。值可以在 0 到 5 之间 【参考方案1】:

我可以给你一些启发,因为我假设“状态”只能是 0 或 1。如果这不是真的,那么 - 我认为 - 你必须执行两个具有不同谓词的单独提取(一个用于获取引用 user1 的位置计数和另一个状态计数,其中 user = user1 和 status = 1)。

NSFetchRequest *fetchRequest =  [[NSFetchRequest alloc] init];

//create entity
NSEntityDescription *entity = [NSEntityDescription entityForName:@"UserProfile" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

//filter for user = user1
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user == %@",user1];
[fetchRequest setPredicate:predicate];

//count of the status == 1 
NSExpressionDescription* sumStatusIsOne = [[NSExpressionDescription alloc] init];
[sumStatusIsOne setExpression:[NSExpression expressionForFunction:@"sum:"
                                            arguments:[NSArray arrayWithObject:[NSExpression expressionForKeyPath:@"status"]]]];
[sumStatusIsOne setExpressionResultType:NSDecimalAttributeType];
[sumStatusIsOne setName:@"sumStatusIsOne"];

//count of the location
NSExpressionDescription* locationCount = [[NSExpressionDescription alloc] init];
[locationCount setExpression:[NSExpression expressionForFunction:@"count:"
                                                 arguments:[NSArray arrayWithObject:[NSExpression expressionForKeyPath:@"Location"]]]
 ];
[locationCount setExpressionResultType:NSDecimalAttributeType];
[locationCount setName:@"locationCount"];

NSArray *subtractComponents = [NSArray arrayWithObjects:
                          locationCount.expression,
                          sumStatusIsOne.expression, nil];

//Count of zero status !!!Important, it is working if the 'status' can be only 1 or 0!!!
NSExpression *countOfZeroStatusExpression = [NSExpression expressionForFunction:@"from:subtract:" arguments:subtractComponents];
NSExpressionDescription* countOfZeroStatus = [[NSExpressionDescription alloc] init];
[countOfZeroStatus setExpression:countOfZeroStatusExpression];
[countOfZeroStatus setExpressionResultType:NSDecimalAttributeType];
[countOfZeroStatus setName:@"countOfZeroStatusExpression"];

[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"Location", locationCount,countOfZeroStatus, nil]];
[fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObject:@"Location"]];
[fetchRequest setResultType:NSDictionaryResultType ];

NSError *error;
NSArray *grouppedResults = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

NSLog(grouppedResults);

【讨论】:

状态可以在 0 到 5 之间,但我只对状态 0 感兴趣 在这种情况下,我认为 CD 无法在一个单独的 fetchrequest 中处理它...不幸的是,您必须获取我之前提出的位置 locationCount,而不是遍历结果数组,并执行一个新的 NSFetchRequest 谓词表示状态 == 0 条件...我知道,这是很多计算工作,但 NSExpression 无法处理分离的谓词...

以上是关于复杂核心数据查询需要帮助的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助在 Swift 3 中过滤核心数据

需要帮助在 Swift 的 UITableView 中显示核心数据

核心数据需要帮助(初学者)

xCode / iOS - 需要帮助使核心数据搜索谓词工作

需要帮助将 MYClass 对象存储在核心数据中

我在 php mysql 复杂查询中需要帮助