Realm更新值时是否自动规避冗余写入?需手动校验吗?
Realm更新时是否需要手动校验值来避免冗余写入?
核心问题
更新Realm对象时,是否需要自行添加值校验逻辑来避免冗余数据库写入?还是Realm底层会自动处理相同值的赋值操作?
示例实体类
class SomeEntity: Object { @Persisted(primaryKey: true) var id = 0 @Persisted var aaa: String? @Persisted var bbb: Float? @Persisted var ccc: Int? }
两种更新写法对比
带值校验的写法(原写法)
newDownloadedData.forEach { entry in guard let id = entry["id"].int else { return } try? localRealm.write { let entity = existingLocalEntities.first { $0.id == id } ?? SomeEntity(id: id) localRealm.add(entity, update: .modified) // 自动执行插入或更新 if entity.aaa != entry["aaa"].string { entity.aaa = movieInfo["aaa"].string } if entity.bbb != entry["bbb"].float { entity.bbb = movieInfo["bbb"].float } if entity.ccc != entry["ccc"].int { entity.ccc = movieInfo["ccc"].int } } }
无值校验的写法(疑问写法)
entity.aaa = movieInfo["aaa"].string entity.bbb = movieInfo["bbb"].float entity.ccc = movieInfo["ccc"].int
解答
完全不需要手动加值校验,直接用无校验的写法就行。
Realm底层会自动判断属性赋值是否真的改变了值:
- 如果新值和当前属性值完全相同,Realm不会执行任何实际的数据库写入操作,也不会触发该对象的变更通知。
- 只有当赋值的新值和旧值存在差异时,Realm才会在事务中记录这次变更。
另外,这种直接赋值的写法不仅更简洁,还能减少代码维护成本——不用每次新增属性都额外加一套校验逻辑。批量更新时这么写,性能和带校验的写法几乎没有差异,甚至在某些场景下因为减少了条件判断,执行效率还会略高。
内容的提问来源于stack exchange,提问作者Heps
相关产品推荐
相关产品推荐

