我的主要问题是:
有没有一种方法可以为领域模型指定默认值,该默认值仅在从新创建模型时使用,但在领域自动从调用更新模型时被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,因此当领域发现事物已存在时,它会更新值并将其重置favourited回false。
我知道明显的答案是从领域中提取对象并自己更新它(如果存在),这样我就可以手动控制更新的内容(如果没有更好的选择,这就是我要做的),但是可能有 100 个甚至成千上万的东西,所以我宁愿尝试避免仅仅为了这个问题就先将对象拉出来。
对于那些有相同情况的人,我发现将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)
注意:我确信领域更新的技术实现比某些对象比较或相交要复杂得多。提供解释只是为了帮助理解问题和解决方案,而不是记录其实际工作方式
| 归档时间: |
|
| 查看次数: |
1799 次 |
| 最近记录: |