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

jdo*_*doe 8 group-by core-data ios swift

需要帮忙.

我的桌子上有4个字段:

  • 电子邮件
  • 信息
  • 接收日期

我想选择电子邮件,消息(最近),date_received和未读消息的总和

这是我的预期结果:

test@email.com | 测试消息| 2015-02-27 | 28 test2@email.com | 测试Message2 | 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)!
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

Mun*_*ndi 1

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

let count = (result.filteredArrayUsingPredicate(
   NSPredicate(format: "read = NO")) as NSArray).count
Run Code Online (Sandbox Code Playgroud)

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

let count = result.count - result.valueForKeyPath("@sum.read")!.integerValue
Run Code Online (Sandbox Code Playgroud)