2017-01-17 3 views
0

Wie aktualisiere ich ein Objekt List, ohne alle Objekte zu löschen und einen Datensatz mit einem bestimmten Primärschlüssel zweimal anzuhängen?Objekt nur einmal der Realm-Liste hinzufügen

Zum Beispiel:

Ich habe ein User Objekt. Dieser Benutzer hat viele locations vom Typ UserLocation. Wenn ich nun meine RESTful-API für alle Standorte anfrage (z. B. /api/users/6/locations), möchte ich prüfen, ob alle Standorte noch aktuell sind, und schließlich ungültig machen und einmal ungültig machen.

Antwort

1

Sie können UserLocation.create(..., update: true) zum Aktualisieren der Objekte mit vorhandenen Primärschlüsseln verwenden, weitere Informationen finden Sie in docs.

Für das Löschen müssen Sie ungültige Objekte manuell löschen, jedoch müssen Sie nicht löschen, wenn Sie von Lists nur aus dem Bereich löschen können und Ihre Beziehungen automatisch aktualisiert werden.

+0

Danke für die Antwort! Aber wenn ich den Benutzerstandort an die "Liste" anschließe, wird er immer noch zweimal nach der nächsten Anfrage hinzugefügt. Ist es irgendwie möglich, anzufügen oder zu aktualisieren, wenn bereits in dieser "Liste"? – Tobias

0

Ich musste ähnliches in einem meiner letzten Projekte tun. Ich bin mir nicht sicher, ob das der beste Weg ist.

let realm = try! Realm() 
realm.beginWrite() 

let locations = User.locations //existing locations 

var locIdsAdded : [String] = [] 
//1. collect existing locations 
let existingIds = channels.map({ (loc) -> String in 
    return loc.primaryKey 
}) 
//2. add or update objects from server 
for loc in locationDictsFromServer { 
    let locObj = parseFromDict(loc) //parse dictionary into RealmObject 
    realm.add(locObj, update: true) // update: true not to add duplicated 
    if(existingIds.index(of: locObj.primaryKey) == nil) { // check if need to add 
     user.locations.append(locObj) 
    } 
    locIdsAdded.append(locObj.primaryKey) 
} 
//3. remove non updated objects 
var removeSet:Set<String> = Set(existingIds) 
removeSet.subtract(locIdsAdded) 
for(removeId) in removeSet { 
    if let obj2Remove = realm.object(ofType: UserLocation.self, forPrimaryKey: removeId) { 
     realm.delete(obj2Remove) 
    } 
} 
try! realm.commitWrite() 
Verwandte Themen