【问题标题】:Check realm create function returning object new or updated检查领域创建函数返回新对象或更新对象
【发布时间】:2019-06-28 13:13:37
【问题描述】:

当我们用主键创建领域对象时:

class Dog: Object {
    @objc dynamic var id: Int = 0
    @objc dynamic var someValue: Int = 0
    override static func primaryKey() -> String? { return "id" } 
}

let realm = try! Realm()
realm.write {
    let dog = realm.create(Dog.self, value:["id" : 1], update: .modified)
    if dog.isNew { //need to check dog is newly created or an existing object. 
        dog.someValue = 0
    } else {
        dog.someValue += 1
    }
}

我们如何检查上面的狗对象是新创建的还是更新的?

【问题讨论】:

  • 这个问题有点含糊;如果你想更新一个对象,那么你会在尝试更新它之前知道它的 id。另外,我不相信let dog = realm 是有效的语法——它可能会抛出异常。如果您通过 true (已折旧),它将起作用。你能进一步解释一下这个用例吗?
  • @Jay 它是一个有效的语法。 let dog = realm.create(Dog.self, value:["id" : 1], update: .modified) 将创建一个新的 dog 对象,如果它不存在,否则将更新该对象(如果存在)。这里的用例是,如果它已经存在,我必须增加它的一个变量,否则只需将其设置为 0。我将更新问题以更清楚。
  • 函数我很熟悉。更新到 Realm 3.17 并且工作正常,只需将 realm.write 更改为 try! realm.write

标签: ios swift realm realm-mobile-platform


【解决方案1】:

我不相信 create 函数有直接的方式来指示对象是创建还是修改。不过,这是一个很棒的功能要求;知道对象是在 realm.create 调用中创建还是存在会很方便。

话虽如此,这是一个问题的解决方案,它将检查并指示对象是否被创建或修改。

代码第一次运行时,它将创建一个主键为 0 的对象并将其打印到控制台。再次运行它将增加该对象的 someValue 属性并打印更新的对象 someValue。

代码检查具有给定主键的对象是否存在;如果不是,则使用 someValue 的默认值创建一个新对象。如果是,则增加 someValue 并更新对象。

let realm = try! Realm()
let primaryKey = 0
guard let dog = realm.object(ofType: Dog.self, forPrimaryKey: primaryKey) else {
    try! realm.write {
        let newDog = realm.create(dog.self, value:["id" : primaryKey, "someValue" : 0], update: .modified)
        print("new dog created: \(newDog)")
    }
    return
}

try! realm.write {
    dog.someValue += 1
    realm.add(dog, update: .modified)
    print("existing object updated \(dog)")
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多