You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 07:15:38