gpt4 book ai didi

swift - Realm :创建用户的新实例正在删除其他用户实例的存储列表

转载 作者:行者123 更新时间:2023-11-28 15:53:24 25 4
gpt4 key购买 nike

在我的用户模型中,我存储了一些这样的列表:

public final class User: Object, Mappable {

dynamic var id: Int = 0
dynamic var name: String? = nil
var addresses = List<Address>()
var children = List<Child>()
var godparents = List<User>()
}

我在 Realm 中保存了 ID 为 1 的用户,以及一些地址和 child ,它运行良好并且在应用程序被终止后仍然存在。

但是当我想创建全新的用户时,例如 ID 为 2 和 3 的用户,ID 为 1 的用户将丢失所有列表数据(名称仍将保留,但所有地址或 child 都将丢失)。这里有什么问题吗?

这是我要在用户 1 的教 parent 列表中添加用户 2 和 3 的代码:

do {
try realm.write {
// users contains user 2 & 3
let users = self.users.map { (userData) -> User in
return realm.create(User.self, value: userData, update: true)
}

UserManager.currentUser?.godparents.removeAll()
UserManager.currentUser?.godparents.append(contentsOf: users)
}
} catch let error {
print(error) // no error is triggered at this point
}

执行此代码后,用户 1 丢失了 addresses & children 中的所有数据

如果需要,这里是 currentUser 方法的代码(获取用户 ID 1):

struct UserManager {
static var currentUser: User? {
get {
guard let id = UserDefaults.standard.object(forKey: "current_user_id") else {
return nil
}

let user = realm?.object(ofType: User.self, forPrimaryKey: id)
return user
}
}
}

最佳答案

当您将 realm.create()update: true 一起使用时,您需要非常小心传递给它的内容。 Realm 不会将存在的值视为“请勿触摸”,而是假设您想要 nil 出该值。

假设 userData 只是一个标准字典,您应该只传递您想要更改的值,并且(理想情况下)忽略任何不更改的值。

关于swift - Realm :创建用户的新实例正在删除其他用户实例的存储列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42076784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com