我有两个Realm
模型类
class ModelA: Object {
let id = RealmOptional<Int>()
dynamic var name: String!
// some other variables that are also String! type
}
class ModelB: Object {
let id = RealmOptional<Int>()
let models = List<ModelA>()
// other variables
}
我有一些
JSON
对象,其中包含该模型的数据。我创建ModelB
实例,然后通过以下方式用ModelA
实例列表填充它:let json: JSON = ... // get it from somewhere, then use SwiftyJSON
let myModelB = ModelB()
myModelB.id.value = json["id"].object as? Int
// set other properties
let modelsA = json["models"].map { ModelA(value: $0.1.object) }
myModelB.models.appendContentsOf(modelsA)
我在这里使用不同方法的原因是
JSON
中的属性名称与ModelB
的属性名称不匹配,但是对于ModelA
来说,这是可以的。稍后在某个地方,我使用
realm.add(objects, update: true)
(在realm.write
内部),这导致以下异常:由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[valueForUndefinedKey:]:此类不符合键的键值编码标准(空)。
根据documentation:
如果模型类包含主键,则可以使Realm使用Realm()。add(_:update :)根据主键值智能地更新或添加对象。
所以
ModelA
和ModelB
都具有primaryKey()
功能,我认为应该可以,但事实并非如此。此外,我在调用中删除了
update
参数,并在添加新对象之前在realm.deleteAll()
回调中添加了对write
的调用。在这种情况下,我得到以下异常:由于未捕获的异常“RLMException”而终止应用程序,原因:“无法将主键属性“id”设置为现有值“xxxxxxx”。
另外,如果我尝试遍历调用堆栈,则Xcode会崩溃。如果我尝试检查调试器中的任何
Realm
对象,它也会崩溃。我已经安装了Realm
Xcode插件,但没有任何变化。我不明白这里出了什么问题以及为什么我会有如此奇怪的行为。有人可以告诉我我的错误在哪里吗? 最佳答案
我基于example project从头开始项目。所以我完成了:
import UIKit
import RealmSwift
// Dog model
class Dog: Object {
dynamic var name = ""
dynamic var age = 0
dynamic var owner: Person? // Properties can be optional
override class func primaryKey() -> String? { return "name" }
}
// Person model
class Person: Object {
dynamic var name = ""
let dogs = List<Dog>()
override class func primaryKey() -> String? { return "name" }
}
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
do {
try NSFileManager.defaultManager().removeItemAtPath(Realm.Configuration.defaultConfiguration.path!)
} catch {}
let dogRexJSON: AnyObject = ["name": "Rex", "age" : 20]
let dogLuckyJSON: AnyObject = ["name": "Lucky", "age" : 25]
var somePerson = Person(value: ["name" : "Shurik", "dogs" : [dogRexJSON]])
// Realms are used to group data together
let realm = try! Realm() // Create realm pointing to default file
// Save your object
realm.beginWrite()
realm.add(somePerson)
try! realm.commitWrite()
somePerson = Person(value: ["name" : "Shurik", "dogs" : [dogRexJSON, dogLuckyJSON]])
try! realm.write { () -> Void in
realm.add([somePerson], update: true)
return
}
let val = realm.objectForPrimaryKey(Dog.self, key: "Lucky")
print(val!.name) // as expected log >> Lucky
return true
}
}
似乎一切正常。
关于ios - 有关更新Realm对象的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35018084/