Android 房间数据库:OnConflictStrategy.ABORT 与 IGNORE 之间的区别

Android Room Database: Difference between OnConflictStrategy.ABORT vs IGNORE

房间数据库中的 OnConflictStrategy.ABORTOnConflictStrategy.IGNORE 有什么区别?

我知道他们都不会在已有行时添加新行。

  1. 它们之间到底有什么区别?
  2. 在什么情况下我们必须使用它们?

ABORTIGNORE有区别。如果您尝试插入具有相同键或唯一约束的对象并抛出 ABORT 将取消事务:

 android.database.sqlite.SQLiteConstraintException: 

IGNORE 忽略冲突,如果您的插入方法是这样的,则不会抛出异常和 return -1 作为 ID 号:

@Insert(onConflict = OnConflictStrategy.IGNORE)
 long insert(SoundCardModel soundCardModel);

而不是这个:

@Insert(onConflict = OnConflictStrategy.IGNORE)
 void insert(SoundCardModel soundCardModel);

阅读:

https://developer.android.com/reference/androidx/room/OnConflictStrategy

一笔交易通常由超过1条INSERTUPDATE条语句组成。

根据您的要求,您必须决定如果这些语句中的任何一个违反了 UNIQUENOT NULLCHECKPRIMARY KEY 约束会发生什么情况。

是否希望事务在第一次违规发生时停止并回滚由导致违规的语句所做的更改?
如果答案是 yes 那么您必须使用 ABORT,这是默认行为。

如果任何语句通过忽略而不是实际执行该有问题的语句而违反约束,您是否希望事务继续执行下一条语句?
如果答案是 yes 那么你必须使用 IGNORE.