7

のリストに重複を追加しないようにするにはどうすればよい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"
    }
}
4

2 に答える 2

12

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

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)
    }
}
于 2016-07-22T07:09:08.060 に答える