领域添加对象并更新 - 忽略缺失值

TRG*_*TRG 3 realm ios swift

我的主要问题是:

有没有一种方法可以为领域模型指定默认值,该默认值仅在从新创建模型时使用,但在领域自动从调用更新模型时被realm.add(thing, update: true)忽略



这是一些上下文信息...

我有一个导入器脚本,它从 API 中提取大量数据并将其导入领域。忽略所有不相关的循环和嵌套结构,我基本上有这个:

let thing = SomeThing(value: [
    "id" : jsonData["id"].int!,
    "title" : jsonData["title"].string!,
    "system" : system
])

try! realm.write {
    realm.add(thing, update: true)
}
Run Code Online (Sandbox Code Playgroud)

我的SomeThing模型如下所示:

class SomeThing : Object {

    dynamic var id = 0
    dynamic var title = ""
    dynamic var system : System?

    dynamic var favourited = false

    override static func primaryKey() -> String? {
        return "id"
    }    
}
Run Code Online (Sandbox Code Playgroud)

favourited布尔值不是由 API 提供的,而是在用户收藏该对象时更新。然而,由于模型默认值为 false,因此当领域发现事物已存在时,它会更新值并将其重置favouritedfalse

我知道明显的答案是从领域中提取对象并自己更新它(如果存在),这样我就可以手动控制更新的内容(如果没有更好的选择,这就是我要做的),但是可能有 100 个甚至成千上万的东西,所以我宁愿尝试避免仅仅为了这个问题就先将对象拉出来。

TRG*_*TRG 5

对于那些有相同情况的人,我发现将realm.create更新参数设置为true将满足您的需要。

使用我问题中的方法,领域将与现有对象和新对象相交,并更新两者中存在的任何参数。因为favourited参数是在初始化对象时创建的,所以领域将其视为更改(我已经知道)。

但是,您可以改为使用realm.create并仅传入要更改的值。这本质上会跳过新对象的相交(因为它不存在),并且仅插入(或更新)您传入的值。

所以这:

let thing = Something(value: [...whatever...])
try! realm.write { 
   realm.add(thing, update:true)
}
Run Code Online (Sandbox Code Playgroud)

变成:

try! realm.write {
   let thing = realm.create(Something.self, value: [...whatever...], update: true)
}
Run Code Online (Sandbox Code Playgroud)

注意:我确信领域更新的技术实现比某些对象比较或相交要复杂得多。提供解释只是为了帮助理解问题和解决方案,而不是记录其实际工作方式