当前位置: 首页 > 知识库问答 >
问题:

对于一对多关系,如何统计与查询匹配的核心数据实体?

丁鸿信
2023-03-14

假设我有两个核心数据实体。一个学生实体和一个类实体。在这个例子中,一个学生正好在一个班级中,一个班级可以有很多学生。

我们也假设这些是大类。也就是说,每个班有1000名学生。

类实体如下所示:

NSString* name
NSArray* students

和学生实体:

NSString* name
Class* class
NSString* grade

在我的UI中,我想显示一个类。我想显示有一定分数的学生人数。一、 对于一个1000名学生的班级,50名学生得了a,500名学生得了B,200名学生得了C,以此类推。

从核心数据中获取这些计数的最有效方法是什么?

我是当前的;y使用NSFetchedResultsController,并向它传递一个group by count查询的获取请求。我正在使用NSFetchedResultsController,这样UI就会随着某个分数的学生数量的变化而更新。虽然它很慢。

有没有办法在不查询的情况下获取此信息?即,当学生被添加到班级或他们的成绩被更改时,班级上的属性会更新所有成绩计数。因此,当我想要计数时,只有类的一个属性,不需要查询。

可能吗?

共有3个答案

诸葛苏燕
2023-03-14

swift中最简单的方法。

let request = NSFetchRequest(entityName: "BWCoreDataNotification")
request.predicate = NSPredicate(format: "type = 'purchase_reward'")

var error: NSError?
let numberOfNotifications = NSManagedObjectContext.MR_defaultContext().countForFetchRequest(request, error: &error)
仲承福
2023-03-14

您可以使用下面的示例来获取给定条件下的计数。不需要取数据来计数。您可以使用< code > countForFetchRequest 方法有效地对对象进行计数。

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:moc]];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:
        @"grade=='A'"];
    [request setPredicate:predicate];

    NSError *err;
    NSUInteger count = [moc countForFetchRequest:request error:&err];
    if(count == NSNotFound) {
      //Handle error
    }

    [request release];
燕烨
2023-03-14

您可以尝试此获取请求:

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Student"];
[request setResultType:NSDictionaryResultType];
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"grade"];
NSExpression *countExpression = [NSExpression expressionForFunction:@"count:" arguments:[NSArray arrayWithObject:keyPathExpression]];

NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName:@"gradeTypeCount"];
[expressionDescription setExpression:countExpression];
[expressionDescription setExpressionResultType:NSInteger64AttributeType];
[request setPropertiesToFetch:@[@"grade",expressionDescription]];
[request setPropertiesToGroupBy:@[@"grade"]];
[request setPredicate:[NSPredicate predicateWithFormat:@"theClass == %@",cls.objectID]];

这将产生一个包含所需值的字典数组。< br >这里的问题是,您的FRC将无法跟踪这些结果的变化。因此,首先没有理由使用FRC < br >即使如此,这也是一个非常轻量级的请求,您可以在给定的时间间隔内发出它并更新您的UI。< br >

(例如2秒,由于您不再处理托管对象,您可以在后台执行整个过程,并将结果转储到主线程)

或者听取主上下文中的更改,如果学生元素发生更改,则再次重新获取计数。

这将避免将任何学生元素一起获取(以所描述的成本)。

 类似资料:
  • 实现了一对多的关系,它运行良好。 我的问题是当我运行下面的查询时,如果表有100个员工行,每个员工有两个部门。数据库查询被调用了101次,因为对每个员工都是调用部门查询,要完成调用全部100行需要很长时间,有没有人可以提出替代的解决方案? 输出XML:

  • 问题内容: 我有以下表格(仅列出必需的属性) 药品(身份证,姓名), 通用(ID,名称), med_gen(med_id引用医学(id),gen_id引用一般(id),效力) 样本数据 药物 (1,“ Crocin”) (2,“ Stamlo”) (3,’NT Kuf’) 通用的 (1,“六氯丁啶”) (2,’苯甲酸甲酯’) med_gen (1,1,‘100mg’) (1、2,“ 50毫升”)

  • 问题内容: 任何人都可以解释在设计带有示例的表时如何实现一对一,一对多和多对多关系吗? 问题答案: 一对一: 使用外键访问被引用的表: 您还必须在外键列()上设置唯一约束,以防止子表()中的多行与引用表()中的同一行相关。 一对多 :在关系的许多方面使用外键链接回“一个”侧: 多对多 :使用联结表(例如): 查询示例:

  • 我正在读MongoDB在行动这本书。我有一个关于的问题。 在中,该书给出了一个多对多关系的示例。它给出了文档和文档。 我理解这里的多对多关联。基本上,可以有一个带有_id等数组的键。所以我不想问类似MongoDB多对多关联的问题 我的问题是关于的,书中给出了关于查询多对多关系的两个示例查询。下面是两个查询: > 是什么意思?我以为只存在于Ruby驱动程序中。 中的是什么?是收藏吗? 中的是什么?

  • 本文向大家介绍一对一、一对多的关联查询 ?相关面试题,主要包含被问及一对一、一对多的关联查询 ?时的应答技巧和注意事项,需要的朋友参考一下

  • 问题内容: 我有一个关于JPA-2.0(提供者为Hibernate)关系及其在Java中的相应管理的问题。假设我有一个Department和一个Employee实体: 现在,我知道我必须自己管理Java关系,如以下单元测试所示: 如果我遗漏任何一个,否则断言将失败。到目前为止,一切都很好。如果我在两者之间提交数据库事务该怎么办? 我还需要管理双方关系吗?不,事实证明,我不必这样做。有了这个修改 这