我的主要问题是:
是否有一种方法可以为Realm模型指定默认值,该模型仅在从new创建Model时使用,但在realm自动从{{1}更新模型时被忽略调用
以下是上下文的一些信息......
我有一个导入程序脚本,它从API中提取大量数据并将其导入域。忽略所有不相关的循环和嵌套结构,我基本上都有这个:
realm.add(thing, update: true)
我的let thing = SomeThing(value: [
"id" : jsonData["id"].int!,
"title" : jsonData["title"].string!,
"system" : system
])
try! realm.write {
realm.add(thing, update: true)
}
模型如下所示:
SomeThing
API不提供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"
}
}
布尔值,并在用户收藏对象时更新。但是,由于模型默认值为false,当领域发现Thing已存在时,它会更新值并将favourited
重置为favourited
。
我知道明显的答案是将对象从领域拉出并自己更新(如果它存在)所以我可以手动控制更新的内容(如果没有更好的选择,这就是我会做的)但是可能会有100或甚至1000的东西,所以我宁愿尝试避免首先将对象拉出来解决这个问题。
答案 0 :(得分:4)
对于那些情况相同的人,我发现更新参数设置为realm.create
的{{1}}可以满足您的需求。
使用我的问题中的方法,域将与现有对象和新对象相交并更新两者中存在的任何参数。因为在初始化对象时会创建true
参数,所以领域会将此视为更改(我已经知道)。
但是,您可以改为使用favourited
并传入要更改的值。这实际上跳过了新对象的交叉(因为它不存在),并且只插入(或更新)传入的值。
所以这个:
realm.create
变为:
let thing = Something(value: [...whatever...])
try! realm.write {
realm.add(thing, update:true)
}
注意:领域更新的技术实现肯定是远的 比某些物体传播或交叉更复杂。说明 仅用于帮助理解问题和解决方案,而不是 记录它的实际运作方式
答案 1 :(得分:0)
当您从服务器获取值时,请执行循环以获取已匹配SomeThing
的已保存id
,然后将其更新为title
和system
以及id,这样你可以保持favourited
,这是我想的唯一方式,我不认为无论如何都要做你提到的。
此外,您正在创建新对象并尝试使用已经内部的对象更新它将导致错误我想,不确定现在是否可以?领域对象不仅包含您声明的属性,还包含其超类
中的更多属性答案 2 :(得分:0)
Realm.create和Realm.add在行为上的差异已作为错误解决,选择了Realm.add行为。同时,我采用了以下方法,该方法将传入对象上的所有属性与存储对象的默认值进行比较,并在适当时从存储中提取它们。还有一个字段列表也可以忽略:
create