我如何防止 RealmSwift 列表中出现重复项?
How do i prevent duplicates in RealmSwift List?
如何防止向 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"
}
}
这取决于来自服务器的数据类型。如果整个播放列表数据总是来(你总是可以替换现有的播放列表数据),你可以将列表删除为空,然后追加它们。
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)
}
}
我优化了@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)
}
}
如何防止向 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"
}
}
这取决于来自服务器的数据类型。如果整个播放列表数据总是来(你总是可以替换现有的播放列表数据),你可以将列表删除为空,然后追加它们。
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)
}
}
我优化了@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)
}
}