2016-11-18 62 views
0

我的主要问题是:

是否有指定的域模型,然后被从新创建的模型时,仅使用默认值的方式,但是,当境界从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) 
} 

和我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" 
    }  
} 

favourited布尔不是由API提供,在用户喜欢该对象时更新。但是,由于模型默认值为false,当领域发现Thing已存在时,它会更新值并将favourited重置为false。我知道显而易见的答案是太拉对象从领域,并自己更新它(如果它存在),所以我可以手动控制什么得到更新(这是我会做什么,如果没有更好的选择),但有可能是100年甚至1000年的东西,所以我宁愿尽量避免首先为这个问题拉出对象。

回答

2

对于那些有同样的情况,我发现realm.create设置为true会做你所需要的更新参数。

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

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

所以这个:

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

变为:

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

注:该技术实现的境界更新的即时通讯肯定比一些对象版本比较或交叉远 更加复杂。提供的解释 只是为了帮助理解问题和解决方案,而不是为了 文件的实际工作方式

0

当你从你的服务器的价值,做一个循环,以获取保存SomeThing已经匹配id,然后更新它的title并与ID一起system,这样可以保持favourited,这是唯一的我想我的方式,我不认为有做你提到的。

除此之外,你正在创建新的对象,并尝试更新它已经在领域内的将导致错误,我想,不知道现在可以吗?由于境界对象不仅包含那些属性声明,但更多的从它的超类

+0

感谢您的回复。我使用主键,所以当我告诉领域添加对象时,如果主键存在,它会更新它。我试图避免将对象从数据库中拉出来,因为那样会(我想)会减慢速度。我发现'realm.create'解决了它! – TRG