2015-09-30 41 views
4

我想知道在多对多关系中获得相关实体数的最佳方法是什么。比方说,我有一个看起来像这样(简化)的数据模型,我想知道乘客的每个总线数:在数据库中获得关系数的有效方法

data model

目前我能想到的两个选项:

  1. 给公交车实体添加一个额外的属性,名为passengerCount,每增加一个乘客就会更新一次。

  2. 每次需要显示乘客的人数时,都是通过提取乘客并显示其数量来完成的。

尽管我不知道用核心数据更新/获取值有多沉重,但我的两个选项看起来效率很低。例如,想象为每个表格视图单元格做数字2。

我的问题是:什么是最好的方法来做到这一点? NSManagedObject类中的方法可能(我找不到任何)或更有效的其他方式?

+0

您可能想查看'NSFetchRequest'' resultType'属性的'NSCountResultType'枚举值。 –

回答

5

最开始有三个备注:

答:在运行有问题时,您应该关心效率。 “不成熟的优化是万恶之源。” (Donald Knuth)

B.谁说所有的乘客实体都必须被提取?你认为这样的事情...

[bus.passengers count] 

...导致乘客被取走。但是核心数据支持错误,所以也许这些实体可能会被误解。 (只有一个ID,但不是完整的对象。)

C.您可以在开启详细模式时看到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。

0

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

您可以将此属性想像为实体的“计算属性”(意思是您不会自己设置属性,但核心数据会在您添加或删除关系时自动更新它)。此属性是NSSet?(参考相关的Passenger对象),NSSet支持.count方法。 因此,您可以使用.count而不需要特殊的提取请求。