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 回答
0

我优化了@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)
  }
}
于 2019-04-01T15:15:25.903 回答