2016-05-16 72 views
0

我有一個具有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) } 
} 

^對於參考

回答

1

看來,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