在数据库

时间:2015-09-30 07:34:30

标签: ios swift core-data nsmanagedobject

我想知道在多对多关系中获取相关实体数量的最佳方法是什么。假设我的数据模型看起来像这样(简化),我想知道每辆公共汽车的乘客数量:

data model

目前我可以想到两个选择:

  1. 为名为 passengerCount 的公交实体添加额外属性,每次添加/删除乘客时都会更新。

  2. 每次需要显示乘客数量时,都会通过取走乘客并显示他们的计数来完成。

  3. 我的两个选项似乎效率都很低,即使我不知道用核心数据更新/获取值有多重。例如,假设为每个表视图单元格执行数字2。

    我的问题是:最好的方法是什么? NSManagedObject类中的方法(我找不到)或其他更有效的方法?

2 个答案:

答案 0 :(得分:5)

一开始有三个评论:

一个。遇到运行时问题时,您应该关心效率。 “过早优化是万恶之源。” (唐纳德克努特)

B中。谁说必须取得所有乘客实体?你想到这样的事情......

[bus.passengers count]

......导致乘客被抓住。但是核心数据支持错误,所以也许实体可能会陷入错误。 (只有一个id,但不是完整的对象。)

℃。当您打开详细模式时,您可以看到Core Data的功能。为此,请传递启动参数

-com.apple.CoreData.SQLDebug 1

问你自己的问题:

如果您确实遇到问题,可以使用-countForFetchRequest:error:明确要求计数。

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"passenger"];
fetch.predicate = [NSPredicate predicateWithFormat:@"bus == %@", bus];
…
NSUInteger count = [context countForFetchRequest:fetch error:NULL]; // Please pass an NSError instance in real world

输入Safari。

答案 1 :(得分:0)

核心数据实体bus的XCode自动生成的NSManagedObject类包含与Passenger个对象的多对多关系的属性。

您可以将此属性视为实体的“计算属性”(意味着您不会自己设置属性,但是当您添加或删除关系时,Core Data会自动更新它)。此属性是NSSet?(引用相关的Passenger对象),NSSet支持.count方法。 因此,您可以在没有特殊提取请求的情况下使用.count