2016-07-21 47 views
4

如何防止將重複項添加到RealmSwift的列表中?如何防止RealmSwift列表中的重複項?

我有我的User作爲領域對象,但真正的數據源是服務器(簡單地用Realm在本地緩存用戶)。當我從服務器獲取當前用戶數據時,我想確保存儲在領域中的用戶具有來自服務器的所有播放列表(以及它們與軌道列表等同步)。我很擔心,如果我從服務器上遍歷這些列表,附加到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) 
    } 
}