2015-05-14 12 views
7

Ho un modello Message/RLMObject con una proprietà/riga NSString *jabberID e voglio recuperare ogni valore unique all'interno di quella riga.Restituisce valori univoci/distinti con query Reame

In altre parole, desidero recuperare i valori jabberID non ripetuti dal mio modello Message. Qualcuno può aiutare a capire questo?

Il modo in cui utilizzo Coredata era l'impostazione returnsDistinctResults su NSFetchRequest.

risposta

6

Ho scoperto che Realm non supporta ancora query distinte. La buona notizia è che ho trovato anche una soluzione per questo, su questo github issue.

Objective-C

RLMResults *messages = [Message allObjects]; 
NSMutableArray *uniqueIDs = [[NSMutableArray alloc] init]; 
NSMutableArray *uniqueMessages = [[NSMutableArray alloc] init]; 
for (Message *msg in messages) { 
    NSString *jabberID = msg.jabberID; 
    Message *uniqueMSG = (Message *)msg; 
    if (![uniqueIDs containsObject:jabberID]) { 
     [uniqueMessages addObject:uniqueMSG]; 
     [uniqueIDs addObject:jabberID]; 
    } 
} 

Swift 3,0

let realm = try! Realm() 
let distinctIDs = Set(realm.objects(Message.self).value(forKey: "jabberID") as! [String]) 
var distinctMessages = [Message]() 
for jabberID in distinctIDs { 
    if let message = realm.objects(Message.self).filter("jabberID = '\(jabberID)'").first { 
     distinctMessages.append(message) 
    } 
} 
+0

'AllObjects' restituisce una raccolta' Results'? – ricardopereira

+1

Sì, restituirà una raccolta Risultati di tutti gli oggetti. –

+0

Vedo, quindi questo approccio perderà la valutazione lenta da 'Risultati'. – ricardopereira

12

approccio di programmazione funzionale in quanto Swift ha, e Realm carichi pigri; Non facile/disponibile una soluzione in Objective-C ma per Swift almeno: Swift

let distinctTypes = reduce(Realm().objects(User), []) { $0 + (!contains($0, $1.type) ? [$1.type] : []) } 

AGGIORNAMENTO:

Swift ridurre è una specie di prestazioni intensive, assegnando un mazzo di array intermedio, invece il seguente dovrebbe essere molto più performante, ma deve essere espressamente cast

let distinctTypes = Array(Set(Realm().objects(User).valueForKey("type") as! [String])) 
Problemi correlati