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中),这会导致以下异常:
Terminating app due to uncaught exception ‘NSUnkNownKeyException’,reason: ‘[ valueForUndefinedKey:]: this class is not key value coding-compliant for the key (null).’
If your model class includes a primary key,you can have Realm intelligently update or add objects based off of their primary key values using Realm().add(_:update:).
所以ModelA和ModelB都有primaryKey()函数,我相信它应该有效,但事实并非如此.
此外,我在调用中删除了update参数,并在添加新对象之前添加了对realm.deleteall()的调用(两者都在写回调中).在这种情况下,我得到以下异常:
Terminating app due to uncaught exception ‘RLMException’,reason: ‘Can’t set primary key property ‘id’ to existing value ‘xxxxxxx’.
此外,如果我尝试通过调用堆栈,Xcode崩溃.如果我尝试检查调试器中的任何Realm对象,它也会崩溃.我已经安装了Realm Xcode插件,但没有任何变化.我无法理解这里出了什么问题以及为什么我会这么奇怪的行为.有人能告诉我,我的错误在哪里吗?
解决方法
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 } }
似乎一切正常.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。