OnConflictStrategy.REPLACE在@Insert与@Update注解下作用是否一致?
结论:两个函数执行效果完全不同
interface BaseDao<T> { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertOrReplace(data: T): Single<Long> @Update(onConflict = OnConflictStrategy.REPLACE) fun update(data: T): Single<Long> }
核心行为差异
- @Insert(onConflict = OnConflictStrategy.REPLACE) 行为:
你对Insert逻辑的理解完全正确:- 传入实体的主键/唯一约束和表中已有记录无冲突:直接插入新记录,返回新记录的rowId
- 传入实体的主键/唯一约束和表中已有记录冲突:删除原有冲突记录,插入新的记录,最终表现为"替换",返回新插入记录的rowId
- @Update(onConflict = OnConflictStrategy.REPLACE) 行为:
这个注解的核心逻辑是仅针对表中已存在的、与传入实体主键匹配的记录执行更新,和Insert逻辑有本质区别:- 传入实体的主键在表中不存在:不会执行任何操作,返回受影响行数为0,不会自动插入新记录
- 传入实体的主键在表中存在:执行更新操作,这里的
OnConflictStrategy.REPLACE仅在更新操作本身触发新的唯一约束冲突时生效(比如你把当前记录的唯一键字段更新为另一条已有记录的唯一键值),触发时会删除导致冲突的记录再完成当前更新,返回受影响的行数
示例场景:用户表主键为
userId,当前表中不存在userId = 1001的记录
- 调用
insertOrReplace(User(userId=1001, name="张三")):会成功插入新记录,返回新记录的rowId- 调用
update(User(userId=1001, name="张三")):没有匹配到对应主键的记录,无任何数据变更,返回0
内容的提问来源于stack exchange,提问作者ericn
相关产品推荐
相关产品推荐

