我的模型如下
class Person: Object { dynamic var ID = 0 let dogs= List<Dog>() overrIDe static func primaryKey() -> String? { return "ID" }}class Dog: Object { dynamic var ID = 0 dynamic var name = "" overrIDe static func primaryKey() -> String? { return "ID" }}
我有人存储在Realm中.人有详细页面,我们取,并显示他的狗.如果狗已经存在,我会更新该狗的最新信息并将其添加到人的狗列表中,否则创建新狗,保存并将其添加到人员列表中.这适用于coredata.
// Fetch and parse dogsif let person = realm.objects(Person.self).filter("ID =\(personID)").first { for (_,dict): (String,JsON) in response { // Create dog using the dict info,my custom init method if let dog = Dog(dict: dict) { try! realm.write { // save it to realm realm.create(Dog,value:dog,update: true) // append dog to person person.dogs.append(dog) } } } try! realm.write { // save person realm.create(Person.self,value: person,update: true) }}
在尝试用他的狗更新人时,领域会抛出异常
无法使用现有主键值创建对象
当你调用realm.create(Dog,value:dog,update:true)时,如果数据库中已存在具有该ID的对象,则只需使用您创建的dog实例中的值更新现有对象,但是那个狗实例仍然是一个独立的副本;它不是数据库中的Dog对象.您可以通过检查dog.realm是否等于nil来确认这一点.
所以当你调用person.dogs.append(dog)时,因为dog还没有在数据库中,所以Realm会尝试创建一个全新的数据库条目,但是因为已经有一个带有该ID的狗而失败了.
如果要将该狗对象附加到某个人,则需要查询Realm以检索引用数据库中条目的正确狗对象.值得庆幸的是,使用主键支持的Realm对象非常简单,因为您可以使用Realm.object(ofType:forPrimaryKey :)方法:
if let person = realm.object(ofType: Person.self,forPrimaryKey: "ID") { for (_,JsON) in response { //Create dog using the dict info,my custom init method if let dog = Dog(dict: dict) { try! realm.write { //save it to realm realm.create(Dog,value: dog,update: true) //get the dog reference from the database let realmDog = realm.object(ofType: Dog.self,forPrimaryKey: "ID") //append dog to person person.dogs.append(realmDog) } } } try! realm.write { //save person realm.create(person .self,value: collection,update: true) }}总结
以上是内存溢出为你收集整理的ios – Realm – 无法使用现有主键值创建对象全部内容,希望文章能够帮你解决ios – Realm – 无法使用现有主键值创建对象所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)