在数据库中获取关系计数的有效方法
Posted
技术标签:
【中文标题】在数据库中获取关系计数的有效方法【英文标题】:Efficient way to get relationship count in database 【发布时间】:2015-09-30 07:34:29 【问题描述】:我想知道在对多关系中获取相关实体计数的最佳方法是什么。假设我有一个看起来像这样(简化)的数据模型,我想知道每辆公共汽车的乘客人数:
目前我能想到两种选择:
为巴士实体添加一个名为 passengerCount 的额外属性,该属性将在每次添加/删除乘客时更新。
每次需要显示乘客人数时,都是通过抓取乘客并显示他们的人数来完成的。
我的两个选项似乎都非常低效,尽管我不知道使用核心数据更新/获取值有多么繁重。例如,想象为每个表格视图单元格执行第 2 次。
我的问题是:最好的方法是什么?可能是 NSManagedObject 类中的方法(我找不到任何方法)或其他更有效的方法?
【问题讨论】:
您可能想要查看NSFetchRequest
resultType
属性的NSCountResultType
枚举值。
【参考方案1】:
开头的三句话:
A.当您遇到运行时问题时,您应该关心效率。 “过早的优化是万恶之源。” (唐纳德·克努斯)
B.谁说所有的乘客实体都必须被提取?你会想到这样的事情……
[bus.passengers count]
... 导致乘客被接走。但是 Core Data 支持故障,所以实体可能会被提取到故障中。 (只有一个 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 中输入。
【讨论】:
【参考方案2】:XCode 为您的 Core Data 实体 bus
自动生成的 NSManagedObject 类包含一个属性,用于与 Passenger
对象的多对多关系。
您可以将此属性视为实体的“计算属性”(这意味着您不会自己设置属性,但 Core Data 会在您添加或删除关系时自动更新它)。该属性是一个NSSet?
(引用相关的Passenger
对象),NSSet 支持.count
方法。
所以你可以使用.count
而不需要特殊的获取请求。
【讨论】:
以上是关于在数据库中获取关系计数的有效方法的主要内容,如果未能解决你的问题,请参考以下文章