如何在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"
}
...
}
然后,您可以通过true
到add(_:, 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)
}
}
...
'''update:true''' is pure magic – JCarlos