2015-03-20 15 views
8

Potrzebujesz pomocy.IOS Swift Core Data jak dodawać pola we właściwościToFetch, które nie znajduje się w propertiesToGroupBy

mam 4 pola w moim stole:

  • email
  • wiadomość
  • czytać
  • date_received

Chcę wybrać e-mail, wiadomość (ostatni), date_received i suma nieprzeczytanych wiadomości

Oto mój oczekiwany wynik:

[email protected] | Testuj wiadomość | 2015-02-27 | 28 [email protected] | Testuj wiadomość2 | 2015-02-29 | 2

Oto mój bieżący kod:

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)! 

wyjściowa:

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 
+0

proszę włączyć [rejestrowanie zapytań SQL] (http://stackoverflow.com/questions/6428630/xcode4-and-core-data-how-to-enable-sql-debugging) i opublikować wynikowe zapytanie. – ctietze

+0

Myślę, że twój problem jest taki sam jak ten: http://stackoverflow.com/questions/20995405/how-to-apply-group-by-clause-in-core-data – sheisd

Odpowiedz

1

Wystarczy pobrać wiadomości ze zwykłymi NSManagedObjectResultType (nie trzeba określić, że). Wtedy po prostu liczyć pośrednictwem KVC (zarówno sprawdzonych rozwiązań):

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

niestandardowa ale może bardziej zwięzły sposób to wykorzystać fakt, że wartości logiczne są przechowywane w postaci zer i jedynek

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