Swift 3:Realm创建了额外的对象,而不是更新现有的对象

时间:2017-01-30 10:18:25

标签: ios swift swift3 realm

在我的AppDelegate

let realm = try! Realm()
    print("number of users")
    print(realm.objects(User.self).count)
    if !realm.objects(User.self).isEmpty{
        if realm.objects(User.self).first!.isLogged {
            User.current.setFromRealm(user: realm.objects(User.self).first!)
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let viewController = storyboard.instantiateViewController(withIdentifier :"TabBar") as! CustomTabBarController
            self.window?.rootViewController = viewController
        }
    } else {
        try! realm.write { realm.add(User.current) }
    }

仅当应用程序中没有用户对象时才创建用户

感谢这个answer我以下列方式更新我的对象

public func update(_ block: (() -> Void)) {
    let realm = try! Realm()
    try! realm.write(block)
}

但事实证明它创建了新的User对象。如何始终更新现有的对象而不是创建新对象?

请注意,我使用User.current,因为我的对象是单身

登录和注销后,它会打印用户数= 2,这意味着更新现有用户会创建一个新用户

2 个答案:

答案 0 :(得分:7)

Realm会检查对象是否存在。仅使用addupdate

// Create or update the object
try? realm.write {
   realm.add(self, update: true)
}     

文档:

 - parameter object: The object to be added to this Realm.
 - parameter update: If `true`, the Realm will try to find an existing copy of the object (with the same primary
                     key), and update it. Otherwise, the object will be added.

答案 1 :(得分:2)

realm.write无法添加新对象,除非您在其中调用realm.add。如果您在数据库中获得了2个对象,则意味着您检查对象是否已存在的逻辑是否失败,或者在注销时删除前一个对象的逻辑是否失败。

在同一对象上调用realm.add两次不会向数据库添加2个副本,因此它也可能表示您在逻辑中创建了2个非托管User对象。

无论如何,我建议仔细检查你的逻辑,以确保你不会意外地向Realm添加两个对象。

let realm = try! Realm()
let firstUser = realm.objects(User.self).first

if let firstUser = firstUser {
    User.current.setFromRealm(user: firstUser)
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let viewController = storyboard.instantiateViewController(withIdentifier :"TabBar") as! CustomTabBarController
    self.window?.rootViewController = viewController
}
else {
    try! realm.write { realm.add(User.current) }
}