2011-07-27 68 views
9

简化: 表中有3列名为cards。NSPredicate等价于SQL的GROUP BY

ID packTitle长期

ID是列 - 整数从0 ..... 100个

packTitle - 字符串描述包,可以说有3种包装PACK1,PACK2的,PACK3

术语 - 101个项目的不同未排序名称。

通过SQL语句

select packTitle from cards group by packTitle; 

我能得到的3个项目清单。

您能否建议NSPredicate等效于SQL语句GROUP BY。我需要获得一个数组来填充UITableView。

回答

15

CoreData是一个对象图管理框架,而不是SQL数据存储。因此,您应该尽快 - 让自己脱离SQL思维模式。 NSPredicate旨在作为对对象图中符合条件的对象的“一个没有惊喜的谓词”。因此,您可以获取与查询匹配的所有对象,但与分组这些结果不同。如果您想要执行集合操作,请使用键值编码的collection operators。核心数据可能将这些转换为合理的SQL,但这只是一个实现细节。

在这种情况下,就可以得到该组唯一packTitle值与

[myCards valueForKeyPath:@"@distinctUnionOfObjects.packTitle"]; 

这会给你不同的组packTitle值的myCards收藏。如果您需要Core Data存储中的所有卡,则必须运行所有cards的查询,然后应用此收集操作。

另一种方法是制作一个PackInformation实体,或者一些包含title属性的实体。然后,您可以在数据存储中只有3个这些实体,从相应的包实体引用它们。获取全部三个(或最终数字)并获得他们的头衔是微不足道的。正如其他人所说,如果你想要做的是从关系数据集基本上报告,你最好直接使用SQLite。这一切都取决于您从Core Data获得多少其他好处。

+0

非常感谢您的详细信息,并感谢您关注我的问题。看来我需要学习键值编码来理解你的答案。如何使用名为PACK1的packTile删除所有卡也很有趣。希望我会找到一个朝这个方向发展的答案。 – Michael

+0

NSPredicate本身与Core Data无关。它可能与阵列和其他数据库如Realm一起使用。这就是为什么这是一个有效的问题,与SQL进行比较是完全正确的 – brainray

2

假设你正在使用CoreData ......根据Apple Documentation

你一定不能转化“任意” SQL查询到 谓词或提取请求。没有办法,例如, 转换SQL语句,如

SELECT t1.name, V1, V2 
    FROM table1 t1 JOIN (SELECT t2.name AS V1, count(*) AS V2 
     FROM table2 t2 GROUP BY t2.name as V) on t1.name = V.V1 

成获取请求。您必须获取感兴趣的对象,然后使用 直接使用结果执行计算,或者使用数组运算符 。

如果你需要做这样复杂的查询,你可能会更好地使用SQLite。

+0

谢谢您的回复。然后我必须处理结果。 – Michael

+0

不客气。 –