在我的用户模型中,我存储了一些这样的列表:
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的用户,有一些地址和子节点,它工作得很好,并且在应用程序被杀后仍然存在。
但是,当我想要创建全新用户时,例如用户ID为2&amp; 3,id为1的用户将丢失所有列表数据(名称仍将保留,但所有地址或子节点都将丢失)。这有什么不对?
以下是我要添加用户的代码2&amp; 3在用户1的教父母列表中:
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丢失了地址和数据中的所有数据。儿童
如果需要,这是一个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
}
}
}
答案 0 :(得分:1)
当realm.create()
与update: true
一起使用时,您需要非常小心传递给它的内容。 Realm不会将当前值,但空值视为“不要触摸”,而是假设您希望nil
输出该值。
假设userData
只是一个标准字典,你应该只传递你想要改变的值,并且(理想情况下)省略任何不改变的值。