我可以执行单个提取请求,对结果的子集进行 returns 独立计算吗?
Can I perform a single fetch request which returns independent calculations for subsets of the results?
我的数据模型有一个带有 2 个属性的 ClickerRecord 实体:日期 (NSDate
) 和 numberOfBiscuits (NSNumber
)。每次添加新记录时,都可以输入不同的 numberOfBiscuits 值。
为了计算饼干数量的每日平均值,我目前正在对范围内的每一天执行提取请求,并使用相应的 NSExpression
计算当天所有 numberOfBiscuits 值的总和。
问题:我正在使用异步获取请求来避免阻塞主线程,所以当第一条记录和最后一条记录之间有很多天时,它最终变得非常慢。获取请求一个接一个地执行。
我也可以将所有记录加载到内存中并进行排序和计算,但我担心当记录数量变得非常多时它会成为一个问题。
因此,我的问题是:是否可以使用 NSExpressions 为每个日期间隔添加诸如子谓词之类的东西,以便执行单个提取请求并检索一个字典,其中包含每天 numberOfBiscuits 总和的条目?
如果不是,对于这种情况,推荐的方法是什么?
我读过有关子查询的内容,但据我所知,它们不适合这种用途。
这是我在 SO 上提出的第一个问题,所以我希望写得清楚:)
我认为您正在寻找的是 NSFetchRequest
的 propertiesToGroupBy
(请参阅 Apple Docs),但在您的情况下,由于某些原因,实施起来并不直接以后再讨论。
假设您可以指定每次食用的饼干类别,并将其存储在实体的 category
属性中。然后要获得每个类别的饼干总数(忽略日期),您可以使用 NSExpression
和 @sum
并指定:
fetch.propertiesToGroupBy = ["category"]
CoreData 将按 category
对提取结果进行分组,并分别计算每组的总和。
你的问题是(除非你已经从你的 date
属性中删除了时间信息),没有代表日期间隔的 属性分组依据,而 CoreData 不会让您指定分组依据的计算值。您需要向您的实体添加一个新的 day
属性,并在您 add/update 一条记录时计算它,并在分组依据中指定它。如果您随后想计算不同时间间隔(例如数周或数月)的平均值,您将再次面临同样的问题。这样做的另一个缺点是结果将仅包括 days
,其中有 ClickerRecords
:如果用户有一天没有吃饼干,那么提取将不会显示当天的结果(即它不会推断平均值为 0)。您需要在使用结果时适当地处理它。
最好是调整您的异步获取,或者如您所建议的那样,将整个批次读入内存以执行计算。如果您的实体只有这两个属性,并且假设您的用户并不完全靠饼干生活,那么销量应该不会有太大问题。
我的数据模型有一个带有 2 个属性的 ClickerRecord 实体:日期 (NSDate
) 和 numberOfBiscuits (NSNumber
)。每次添加新记录时,都可以输入不同的 numberOfBiscuits 值。
为了计算饼干数量的每日平均值,我目前正在对范围内的每一天执行提取请求,并使用相应的 NSExpression
计算当天所有 numberOfBiscuits 值的总和。
问题:我正在使用异步获取请求来避免阻塞主线程,所以当第一条记录和最后一条记录之间有很多天时,它最终变得非常慢。获取请求一个接一个地执行。 我也可以将所有记录加载到内存中并进行排序和计算,但我担心当记录数量变得非常多时它会成为一个问题。
因此,我的问题是:是否可以使用 NSExpressions 为每个日期间隔添加诸如子谓词之类的东西,以便执行单个提取请求并检索一个字典,其中包含每天 numberOfBiscuits 总和的条目? 如果不是,对于这种情况,推荐的方法是什么?
我读过有关子查询的内容,但据我所知,它们不适合这种用途。
这是我在 SO 上提出的第一个问题,所以我希望写得清楚:)
我认为您正在寻找的是 NSFetchRequest
的 propertiesToGroupBy
(请参阅 Apple Docs),但在您的情况下,由于某些原因,实施起来并不直接以后再讨论。
假设您可以指定每次食用的饼干类别,并将其存储在实体的 category
属性中。然后要获得每个类别的饼干总数(忽略日期),您可以使用 NSExpression
和 @sum
并指定:
fetch.propertiesToGroupBy = ["category"]
CoreData 将按 category
对提取结果进行分组,并分别计算每组的总和。
你的问题是(除非你已经从你的 date
属性中删除了时间信息),没有代表日期间隔的 属性分组依据,而 CoreData 不会让您指定分组依据的计算值。您需要向您的实体添加一个新的 day
属性,并在您 add/update 一条记录时计算它,并在分组依据中指定它。如果您随后想计算不同时间间隔(例如数周或数月)的平均值,您将再次面临同样的问题。这样做的另一个缺点是结果将仅包括 days
,其中有 ClickerRecords
:如果用户有一天没有吃饼干,那么提取将不会显示当天的结果(即它不会推断平均值为 0)。您需要在使用结果时适当地处理它。
最好是调整您的异步获取,或者如您所建议的那样,将整个批次读入内存以执行计算。如果您的实体只有这两个属性,并且假设您的用户并不完全靠饼干生活,那么销量应该不会有太大问题。