Android 房间数据库:OnConflictStrategy.ABORT 与 IGNORE 之间的区别
Android Room Database: Difference between OnConflictStrategy.ABORT vs IGNORE
房间数据库中的 OnConflictStrategy.ABORT
和 OnConflictStrategy.IGNORE
有什么区别?
ABORT
: 回滚发生冲突的事务
IGNORE
: 保留现有行
我知道他们都不会在已有行时添加新行。
- 它们之间到底有什么区别?
- 在什么情况下我们必须使用它们?
ABORT
和IGNORE
有区别。如果您尝试插入具有相同键或唯一约束的对象并抛出 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条INSERT
或UPDATE
条语句组成。
根据您的要求,您必须决定如果这些语句中的任何一个违反了 UNIQUE
、NOT NULL
、CHECK
或 PRIMARY KEY
约束会发生什么情况。
是否希望事务在第一次违规发生时停止并回滚由导致违规的语句所做的更改?
如果答案是 yes 那么您必须使用 ABORT
,这是默认行为。
如果任何语句通过忽略而不是实际执行该有问题的语句而违反约束,您是否希望事务继续执行下一条语句?
如果答案是 yes 那么你必须使用 IGNORE
.
房间数据库中的 OnConflictStrategy.ABORT
和 OnConflictStrategy.IGNORE
有什么区别?
ABORT
: 回滚发生冲突的事务IGNORE
: 保留现有行
我知道他们都不会在已有行时添加新行。
- 它们之间到底有什么区别?
- 在什么情况下我们必须使用它们?
ABORT
和IGNORE
有区别。如果您尝试插入具有相同键或唯一约束的对象并抛出 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条INSERT
或UPDATE
条语句组成。
根据您的要求,您必须决定如果这些语句中的任何一个违反了 UNIQUE
、NOT NULL
、CHECK
或 PRIMARY KEY
约束会发生什么情况。
是否希望事务在第一次违规发生时停止并回滚由导致违规的语句所做的更改?
如果答案是 yes 那么您必须使用 ABORT
,这是默认行为。
如果任何语句通过忽略而不是实际执行该有问题的语句而违反约束,您是否希望事务继续执行下一条语句?
如果答案是 yes 那么你必须使用 IGNORE
.