领域:创建用户的新实例正在删除其他用户实例的存储列表

时间:2017-02-06 20:33:58

标签: swift realm

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

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
        }
    }
}

1 个答案:

答案 0 :(得分:1)

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

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