IOS Swift Core Data如何在propertiesToFetch中添加不在propertiesToGroupBy中的字段

Posted

技术标签:

【中文标题】IOS Swift Core Data如何在propertiesToFetch中添加不在propertiesToGroupBy中的字段【英文标题】:IOS Swift Core Data how to add fields in propertiesToFetch that is not in propertiesToGroupBy 【发布时间】:2015-03-20 12:01:42 【问题描述】:

需要帮助。

我的表中有 4 个字段:

电子邮件 留言 阅读 收到日期

我要选择电子邮件、消息(最近)、接收日期和未读消息的总和

这是我的预期结果:

test@email.com |测试留言 | 2015-02-27 | 28 test2@email.com |测试信息2 | 2015-02-29 | 2

这是我当前的代码:

let fetchRequest:NSFetchRequest = NSFetchRequest()

if let entityDescription:NSEntityDescription = NSEntityDescription.entityForName("Message", inManagedObjectContext: managedObjectContext)
    fetchRequest.entity = entityDescription


fetchRequest.propertiesToFetch = ["email","message","read","date_received"]
fetchRequest.propertiesToGroupBy = ["email"]
fetchRequest.resultType = .DictionaryResultType
fetchRequest.returnsObjectsAsFaults = false

let items:NSArray = managedObjectContext .executeFetchRequest(fetchRequest, error: nil)!

输出:

20 18:24:51.639 JPtxt[33368:1345477] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'SELECT clauses in queries with GROUP BY components can only contain properties named in the GROUP BY

【问题讨论】:

请启用SQL query logging 并发布结果查询。 我觉得你的问题和这个一样:***.com/questions/20995405/… 【参考方案1】:

只需使用通常的NSManagedObjectResultType 获取消息(您无需指定)。然后通过 KVC 获取计数(两种解决方案都经过测试):

let count = (result.filteredArrayUsingPredicate(
   NSPredicate(format: "read = NO")) as NSArray).count

一种非标准但可能更简洁的方法是利用布尔值存储为 1 和 0 的事实

let count = result.count - result.valueForKeyPath("@sum.read")!.integerValue

【讨论】:

【参考方案2】:

您遇到的错误与 SQL 规则有关。也就是说,SQL 指出,如果您想按 ["email"] 进行分组,则不能请求其他属性,除非您也想按它们进行分组。例如,如果您想按“性别”和“年龄”来计算消息,而不是这样。

    fetchRequest.propertiesToFetch = ["email"]

但是,您可以并且将需要“已读”属性上的谓词来表示您只需要未读消息。在发出请求后,谓词通常比过滤更高效:

    fetchRequest.propertiesToGroupBy = ["email"]
    fetchRequest.predicate = NSPredicate(format: "read = NO")

【讨论】:

以上是关于IOS Swift Core Data如何在propertiesToFetch中添加不在propertiesToGroupBy中的字段的主要内容,如果未能解决你的问题,请参考以下文章

IOS Swift Core Data如何在propertiesToFetch中添加不在propertiesToGroupBy中的字段

Swift - 如何检查现有的 Core Data Store iOS

如何在 SWIFT 的 IOS CORE-DATA 请求中使用 SQL GROUP BY 和 SUM 函数?

如何正确设置 Core Data Stack 到 iOS 和 Swift 中的第一个视图控制器?

Swift之深入解析如何结合Core Data和SwiftUI

Swift 3 Core Data - 如何同步保存上下文?