【问题标题】:How do i prevent duplicates in RealmSwift List?如何防止 RealmSwift 列表中的重复?
【发布时间】:2016-07-21 20:37:15
【问题描述】:

如何防止向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"
    }
}

【问题讨论】:

    标签: ios swift realm realm-list


    【解决方案1】:

    这取决于来自服务器的数据类型。如果整个播放列表数据总是出现(您总是可以替换现有的播放列表数据),您可以将列表删除为空,然后附加它们。

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

    【讨论】:

      【解决方案2】:

      我优化了来自@kishikava katsumi 的答案

      所有播放列表对象都在一次调用中添加到数据库中,而不是添加 in for 循环。而且我没有为每个播放列表返回索引,而是使用了更快的函数user.playlists.contains(playlist)

      这里是代码。感谢@kishikava katsumi 的设置。

      let fetchedPlaylists: [Playlist] = ...
      
      try! realm.write {
        realm.add(fetchedPlaylists, update: true)
        for playlist in fetchedPlaylists {
          guard !user.playlists.contains(playlist) else {
            continue
          }
          user.playlists.append(playlist)
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-12-26
        • 2019-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多