核心数据汇总功能
核心数据是一个精美的对象映射和持久性框架 - 苹果工程师的大熊队。
通过核心数据,它真的很容易检索和存储对象。但是,我遇到了需要检索单个属性的最大值。
如果我使用的是SQL,我会使用max()
聚合函数来确定数据集中列的最大值。没有能够直接查询核心数据,我试图弄清楚如何在我的数据中轻松执行聚合函数。
我误解不正确的第一种方法是使用简单的使用最大值从核心数据中检索对象nspredicate
。在编码它之后,我知道必须有更好的方法。
我不需要检索整个对象,只是单个值。当然它在我的模拟器上运行得很快,但我知道我的解决方案中有一些开销。我正在创建一个我甚至不想要或需要的对象。经过一些阅读后,我找到了nsexpressionDescription.
类。这正是我需要的。
入门nsexpression.
S.
用来nsexpressionDescription.
类,我们需要首先创建一个表达式来告诉我们的nsfetchrequest.
哪个属性(列)以及我们要执行的计算(聚合)。在我的情况下,我将寻找存储在我的单词实体中的最大WordId。
//创建nsexpression以告诉我们的nsexpressionDescription我们正在执行计算nsexpression.*基础表达=[nsexpression表达式折扣:@“wordid”];//创建NSExpression以告诉我们的NSExpressionDescription我们正在执行的计算。nsexpression.*最大表达=[nsexpression表达函数:@“max:”争论:[nsarray arraywithObject.:基础表达]];
我正在使用马克斯:
在此示例中的功能。还有其他功能是支持的nsexpression.
:
和:
计数:
闵:
马克斯:
平均:
中位数:
模式:
Stddev:
天花板:
地板:
ABS:
这些不是所有预定义的函数,而是一些最常用的函数。你可以了解更多关于这个问题ExpressionForfunder:参数:
方法,预定义的函数和每个函数所必需的参数。在我的例子中,我们正在使用马克斯:
函数只采用单个参数,该表达式包含键路径。
建立nsexpressionDescription.
接下来,我们将创建一个新的nsexpressionDescription并指定结果名称,生成的数据类型和我们在上面定义的表达式。
nsexpressionDescription.*描述=[[nsexpressionDescription Alloc.]在里面];[描述setName.:@“maxwordid”];[描述setExpression.:最大表达];[描述setExtressionSresultType.:nsinteger32attributetype.];
在上面的第一行我们分配并初始化了NSExpressionDescription类的新实例。然后,我们可以设置名称,表达式和结果类型属性。名称是在上下文上执行获取请求时将返回的属性密钥。表达式是我们之前创建的NSExpression的实例。最后,我们指定了nsattributeType.
存储产生的值。在这种情况下,我正在使用nsinteger32attributetype.
因为我期待签名整数。
最后,我们需要讲述我们只想获取单个属性的NSFetchRequest的实例。要这样做,我们打电话setPropertiStoFetch:
并将属性数组指定为单个nsexpressionDescription.
实例:
[Request SetPropertiestOfetch.:[nsarray arraywithObject.:描述]];
执行nsfetchrequest.
在设置所有内容之后,我们然后执行该获取,这将导致单个对象返回,其中包含我们指定的键中的聚合函数的汇总函数的值(在我们调用的位置setname:
)。
nsarray.*结果=[上下文executefetchrequest.:请求错误:&错误];如果(结果!=零&&结果。计数&GT.;0.){nsnumber.*maxwordid.=[[结果ObjectatIndex.:0.]valueforkey.:@“maxwordid”];nslog.(@“最大word.wordid当前:%@”那maxwordid.);}
您可以了解更多有关获取Apple中的特定对象的更多信息核心数据编程指南。