如何防止 Realm 在将 JSON 解析为 Swift 中的 Realm 数据库时覆盖自身?

How to prevent Realm from overwriting itself while parsing JSON to a Realm database in Swift?

我对 Realm 有疑问。我想使用 Swift 将外部 JSON 脚本写入我的 Realm 数据库。但是当这样做时,它会在每个循环中覆盖我数据库中的记录。当我打印 class print(songClass) 时它显示正确但是当我这样做时

class SongR: Object {

    @objc dynamic var id: String?
    @objc dynamic var rawName: String?
    @objc dynamic var title: String?
    @objc dynamic var artist: String?
    @objc dynamic var album: String?
    @objc dynamic var playlist: String?
    @objc dynamic var link: String?

}


let realm = try! Realm()

let songClass = SongR()


if let url = URL(string: "http://somewebsite.com/json.php") {
            URLSession.shared.dataTask(with: url) { data, response, error in
                if let data = data {
                    let jsonDecoder = JSONDecoder()
                    do {
                        let parsedJSON = try jsonDecoder.decode([Song].self, from: data)
                        let main = DispatchQueue.main.async {
                            try! realm.write {
                                for song in parsedJSON {
                                    songClass.id = song.id
                                    songClass.rawName = song.rawName
                                    songClass.title = song.title
                                    songClass.artist = song.artist
                                    songClass.album = song.album
                                    songClass.playlist = song.playlist
                                    songClass.link = song.link
                                    realm.add(songClass)
                                    print(songClass)
                                }
                            }
                        }
                    } catch {
                        print(error)
                    }
                }
            }.resume()
        }

它会自行覆盖,我只能从我的 Realm 数据库中显示的 JSON 文件中获取最后一个值。

有人知道如何解决这个问题吗?

此外,我想在每次 parse/update JSON 文件时用 JSON 文件中的所有项目覆盖整个 Realm 数据库,而不是将它们添加到其中。我该怎么做?

提前致谢!

找到解决方案。 let songClass = SongR() 需要在循环内:

let main = DispatchQueue.main.async {
                            try! realm.write {
                                for song in parsedJSON {
                                    let songClass = SongR()
                                    songClass.id = song.id
                                    songClass.rawName = song.rawName
                                    songClass.title = song.title
                                    songClass.artist = song.artist
                                    songClass.album = song.album
                                    songClass.playlist = song.playlist
                                    songClass.link = song.link
                                    realm.add(songClass)
                                    print(songClass)
                                }
                            }
                        }