如何在Swift中存在Realm中的嵌套var更新?

问题描述:

我有一个具有User对象的Auth对象。我存储Auth对象,因为它也有其他信息(比如我的访问令牌)。如何在Swift中存在Realm中的嵌套var更新?

如果我登录一次,然后退出 - 没有问题。它创建auth对象,然后创建用户对象...并注销删除auth对象(但保留用户对象),这对我来说很好。

然而,当我去登录第二个时间,因为它试图重新创建用户对象,但主键是一样的,我得到这个错误失败:

"Can't set primary key property 'id' to existing value '123123123'" 

(123123123是一个样本ID)

我如何使它,当我添加一个Auth对象的领土,它更新现有的用户(如果存在),而不是试图创建一个新的瓦特/相同的主键?

谢谢!

验证对象:

class Auth: Object, Mappable { 
    static var currentAuth: Auth? { 
     set { 
      let realm = try! Realm() 
      try! realm.write { 
       if let oldValue = currentAuth { 
        realm.delete(oldValue) 
       } 
       if let currentAuth = newValue { 
        realm.add(currentAuth) 
       } 
      } 
      NSNotificationCenter.defaultCenter().postNotificationName("didChangeLogin", object: nil) 
     } 
     get { 
      let realm = try! Realm() 
      // there should only be 1 or 0 
      return realm.objects(Auth).first 
     } 
    } 

    dynamic var accessToken: String? 
    dynamic var user: User? 

    func mapping(map: Map) { 
     accessToken <- map["access_token"] 
     user <- map["user"] 
    } 

    // MARK: - Convenience 
    class func logout() { 
     currentAuth = nil 
    } 

    // MARK: - Required 
    required init() { super.init() } 
    required init?(_ map: Map) { super.init() } 
    required init(value: AnyObject, schema: RLMSchema) { super.init(value: value, schema: schema) } 
    required init(realm: RLMRealm, schema: RLMObjectSchema) { super.init(realm: realm, schema: schema) } 
} 

用户对象:

class User: Base { 
    dynamic var username: String? 
    dynamic var bio: String? 

    override func mapping(map: Map) { 
     super.mapping(map) 
     username <- map["username"] 
     bio <- map["bio"] 
    } 

    // MARK: - Requireds 
    required init() { super.init() } 
    required init?(_ map: Map) { super.init() } 
    required init(value: AnyObject, schema: RLMSchema) { super.init(value: value, schema: schema) } 
    required init(realm: RLMRealm, schema: RLMObjectSchema) { super.init(realm: realm, schema: schema) } 
} 

^对于参考

看来,User的主键是冲突(也许在Base类中定义?)。

领域没有级联删除,所以User对象甚至被删除旧Auth对象。

如果您想更新何时存在主键的对象,则应将true传递给参数add(_:, update:)update方法。但是,Auth类没有主键属性,因此在添加Auth对象时无法将true传递给update参数。

有两种方法可以解决问题。

1. 第一种方法是将一个主键添加到Auth类(也许,accessToken属性将是适当的。)。像下面这样:

class Auth: Object, Mappable { 
    ... 
    override class func primaryKey() -> String? { 
     return "accessToken" 
    } 
    ... 
} 

然后,您可以通过trueadd(_:, update:)

if let currentAuth = newValue { 
    realm.add(currentAuth, update: true) 
} 

2.

删除旧Auth对象时,第二方法是删除旧User对象。如下:

static var currentAuth: Auth? { 
    set { 
     let realm = try! Realm() 
     try! realm.write { 
      if let oldUserValue = currentAuth?.user { 
       realm.delete(oldUserValue) 
      } 
      if let oldValue = currentAuth { 
       realm.delete(oldValue) 
      } 
      if let currentAuth = newValue { 
       realm.add(currentAuth) 
      } 
     } 
     ... 
+0

'''update:true''' is pure magic – JCarlos