Objective c NSPredicate相当于SQL';s分组方式
要简化: 名为cards的表中有3列 id包标题术语 id是一列-0..100中的整数 packTitle-描述包的字符串,假设有3种包PACK1、PACK2、PACK3 术语-101项的不同未排序名称 按SQL语句Objective c NSPredicate相当于SQL';s分组方式,objective-c,ios,core-data,nspredicate,Objective C,Ios,Core Data,Nspredicate,要简化: 名为cards的表中有3列 id包标题术语 id是一列-0..100中的整数 packTitle-描述包的字符串,假设有3种包PACK1、PACK2、PACK3 术语-101项的不同未排序名称 按SQL语句 select packTitle from cards group by packTitle; 我可以得到3个项目的清单 您能否建议NSPredicate等效于SQL语句GROUP BY。我需要获取一个数组来填充UITableView。假设您使用的是CoreData。。。根据 您
select packTitle from cards group by packTitle;
我可以得到3个项目的清单
您能否建议NSPredicate等效于SQL语句GROUP BY。我需要获取一个数组来填充UITableView。假设您使用的是CoreData。。。根据 您不必将“任意”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。CoreData是一个对象图管理框架,而不是SQL数据存储。因此,您应该尽快摆脱SQL思维模式
NSPredicate
用作对象图中限定对象的无意外谓词。因此,您可以获取与查询匹配的所有对象,但这与对这些结果进行分组不同。如果要执行聚合操作,请使用键值编码。在幕后,核心数据可能会将这些转换为合理的SQL,但这只是一个实现细节
在这种情况下,您可以使用
[myCards valueForKeyPath:@"@distinctUnionOfObjects.packTitle"];
这将为您提供myCards
集合中不同的packTitle
值集。如果要对核心数据存储中的所有卡执行此操作,则必须对所有卡运行查询,然后应用此收集操作
另一种方法是创建一个PackInformation
实体,或一些包含title
属性的实体。然后,数据存储中只能有3个实体,从相应的包实体引用它们。把这三个(或者不管最后的数字是多少)都拿出来,并得到他们的头衔,这是很简单的
正如其他人所说,如果您试图做的基本上是从关系数据集报告,那么最好使用直接的SQLite。这完全取决于您从核心数据中获得的其他好处。谢谢您的回复。然后我必须处理结果。非常感谢您提供的详细信息,特别感谢您关注我的问题。看来我需要学习键值编码来理解你的答案。如何删除所有名为PACK1的packTile卡也很有趣。希望我能找到朝这个方向发展的答案。NSPredicate本身与核心数据无关。它可能与数组和其他数据库(如Realm)一起使用。这就是为什么这是一个有效的问题,并且与SQL进行比较非常好