加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – 更新Realm对象的问题

发布时间:2020-12-14 17:35:11 所属栏目:百科 来源:网络整理
导读:我有两个Realm模型类 class ModelA: Object { let id = RealmOptionalInt() dynamic var name: String! // some other variables that are also String! type}class ModelB: Object { let id = RealmOptionalInt() let models = ListModelA() // other varia
我有两个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中),这会导致以下异常:

Terminating app due to uncaught exception ‘NSUnknownKeyException’,reason: ‘[ valueForUndefinedKey:]: this class is not key value coding-compliant for the key (null).’

根据documentation:

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插件,但没有任何变化.我无法理解这里出了什么问题以及为什么我会这么奇怪的行为.有人能告诉我,我的错误在哪里吗?

解决方法

我从头开始项目,基于 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
    }
}

似乎一切正常.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读