2016-07-21 18 views
4

RealmSwiftのリストに重複を追加しないようにするにはどうすればよいですか?RealmSwiftリストに重複を防止するにはどうすればよいですか?

私はUserをレルムオブジェクトとして持っていますが、実際のデータソースはサーバーです(レルムでローカルにユーザーを単にキャッシュする)。サーバーから現在のユーザーデータを取得するとき、私はレルムに格納されているユーザーがサーバーから来るすべてのプレイリストを持っていることを確認したいと思います(トラックの同期リストなど)。私は、サーバからのリストをループしてmyUser.playlistsに追加すると、同じプレイリストをユーザのプレイリストのリストに複数回追加することになることが心配です。

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" 
    } 
} 

答えて

6

サーバーからのデータの種類によって異なります。プレイリストデータ全体が常に来る場合(既存のプレイリストデータをいつでも置き換えることができます)、空のリストを削除してから追加することができます。

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

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

サーバからの差分データ(重複データもある)がある場合は、そのデータがすでに存在するかどうかを確認する必要があります。

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) 
    } 
} 
関連する問題