2016-07-21 16 views
4

Wie verhindere ich das Hinzufügen von Duplikaten zu einer Liste in RealmSwift?Wie verhindere ich Duplikate in RealmSwift List?

Ich habe meine User als Realm-Objekt, aber die echte Datenquelle ist ein Server (einfach den Benutzer lokal mit Realm zwischenspeichern). Wenn ich die aktuellen Benutzerdaten von meinem Server bekomme, möchte ich sicherstellen, dass mein im Realm gespeicherter Benutzer alle Wiedergabelisten hat, die vom Server kommen (und dass sie synchron mit einer Liste von Titeln usw. sind). Ich mache mir Sorgen, dass ich, wenn ich diese Listen vom Server aus anschließe, an myUser.playlists anschließe, dass ich am Ende dieselbe Wiedergabeliste mehrmals zur Liste der Wiedergabelisten des Benutzers hinzufügen könnte.

class User: Object { 
     
    dynamic var name = "" 
    dynamic var id = "" 
    let playlists = List<Playlist>() 
    override class func primaryKey() -> String { 
        return "id" 
    } 
} 

class Playlist: Object { 
     
    dynamic var name = "" 
    dynamic var id = "" 
    let tracks = List<Song>() 
    override class func primaryKey() -> String { 
        return "id" 
    } 
} 

class Song: Object { 
     
    dynamic var title = "" 
    let artists = List<Artist>() 
    dynamic var id = "" 
    override class func primaryKey() -> String { 
        return "id" 
    } 
} 

class Artist: Object { 
    dynamic var name = "" 
    dynamic var id = "" 
    override class func primaryKey() -> String { 
        return "id" 
    } 
} 

Antwort

6

Es hängt davon ab, welche Art von Daten vom Server kommen. Wenn immer ganze Wiedergabelisten-Daten kommen (Sie können immer vorhandene Wiedergabelisten-Daten ersetzen), können Sie die Liste einfach zu leer entfernen und sie dann anhängen.

realm.write { 
    user.playlists.removeAll() // empty playlists before adding 

    for playlistData in allPlaylistData { 
     let playlist = Playlist() 
     ... 
     user.playlists.append(playlist) 
    } 
} 

Wenn vom Server stammende Differenzdaten (auch einige sind doppelt vorhanden), müssen Sie prüfen, ob die Daten bereits existieren.

realm.write { 
    for playlistData in allPlaylistData { 
     let playlist = Playlist() 
     ... 

     realm.add(playlist, update: true) // Must add to Realm before check 

     guard let index = user.playlists.indexOf(playlist) else { 
      // Nothing to do if exists 
      continue 
     } 
     user.playlists.append(playlist) 
    } 
} 
Verwandte Themen