2017-01-30 23 views
4

在我的AppDelegate的斯威夫特3:领域创造更多的对象,而不是更新等植物学一个

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.current,因为我的目标是单

后,我登录和退出,它打印的用户总数= 2,这意味着更新已经存在的用户创建一个新的

回答

1

realm.write是不能添加新对象,除非你打电话realm.add它里面的。如果您在数据库中获取2个对象,则意味着您检查对象是否已存在的逻辑失败,或者注销时出现的删除前一个对象的逻辑失败。

在同一对象上调用realm.add两次不会将两个副本添加到数据库,因此它也可能表示您在逻辑中也创建了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) } 
} 
+0

我没有在我以前的数据库相关的类管理器的其他地方添加对象,我设法修复它自己,但我认为这个答案值得接受:) – DCDC

6

境界会检查对象是否存在。只能使用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.