在 RoomDB 上插入数据时,处理策略冲突的最佳方法是什么? 正如我所尝试的那样。
@Insert(onConflict = @Insert(onConflict = OnConflictStrategy.REPLACE))
但它不起作用,因为在冲突期间它有时会重复并扰乱 plk 值的自动增量。
@Insert(onConflict = OnConflictStrategy.NONE)
但这有时并不能取代,因此有时我不得不回去使用第一个冲突策略
@Insert(onConflict = OnConflictStrategy.REPLACE)
文档为我提供了同一函数或库的两个语句
@Insert(onConflict = OnConflictStrategy.REPLACE)
当您将鼠标放在“REPLACE”上时,它会显示“OnConflict策略常量,用于替换旧数据并继续事务”在OnConflictStrategy.REPLACE
上,在OnConflictStrategy.NONE
上您会得到“当没有其他策略时默认使用的OnConflict策略常量”设置。使用它可以防止 Room 生成 ON CONFLICT 子句。当需要在触发器内使用 ON CONFLICT 子句时,它可能很有用。运行时行为与应用 ABORT 策略时相同。事务将回滚”
但是当您导航到实现或库对象时。你会得到类似 “OnConflict 策略常量来回滚事务。” 在
OnConflictStrategy.REPLACE
上,在 OnConflictStrategy.NONE
上你会得到 “OnConflict 策略常量来替换旧数据并继续事务。”
弄乱 plk 值的自动增量
rowid(具有 AUTOINCRMENT 的列是其别名)的预期用途是唯一地 id 实体row。如果您以其他方式使用该值,那么您很可能会遇到问题。
您似乎已忽略的选项是
@Insert(onConflict = OnConflictStrategy.IGNORE)
。这将忽略冲突并通过 @Insert
返回 -1 所返回的 Long 值反映出来。
因此,如果您想要插入或替换而不存在
@Insert(onConflict = OnConflictStrategy.REPLACE)
的潜在问题,那么您可以
使用@Upsert
或使用以下代码:-
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insert(whatever: WHATEVERCLASS): Long
@Update
fun update(whatever: WHATEVERCLASS): Int
@Transaction
@Query("")
@InsertOrUpdate(whatever: WHATEVECLASS)
if (insert(whatever) < 1) {
update(whatever)
}
}