2015-05-14 4 views
7

Ich habe ein Message/RLMObject Modell, das eine NSString *jabberID Eigenschaft/Zeile hat und ich möchte alle unique Wert innerhalb dieser Zeile abrufen.Rückgabe eindeutige/verschiedene Werte mit Realm-Abfrage

Mit anderen Worten, ich möchte nicht wiederholt jabberID Werte von meinem Message Modell abrufen. Kann mir jemand helfen, das herauszufinden?

Die Art, wie ich mit Coredata verwende, war returnsDistinctResults Einstellung auf der NSFetchRequest.

Antwort

6

Ich fand heraus, Realm unterstützt noch nicht eindeutige Abfragen. Die gute Nachricht ist, dass ich auch einen Workaround dafür gefunden habe, 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

umgewandelt werden Gibt 'allObjects' eine' Results'-Sammlung zurück? – ricardopereira

+1

Ja, es wird eine Ergebnissammlung aller Objekte zurückgegeben. –

+0

Ich sehe, dann wird dieser Ansatz die faule Auswertung von "Ergebnisse" verlieren. – ricardopereira

12

Funktionale Programmierung Ansatz, da Swift hat, und Realm faul Lasten; Nicht so einfach/available eine Lösung in Objective-C, aber für Swift mindestens: Swift

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

AKTUALISIERT:

Swift reduzieren ist ein bisschen eine Leistung intensiv, ein Bündel Zuteilen von Intermediate-Arrays, stattdessen sollte das folgende viel besser Leistung sein, aber muss explizit

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