将数据插入房间数据库

问题描述 投票:0回答:1

在 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 策略常量来替换旧数据并继续事务。”

android-room kotlin-coroutines kotlin-flow android-design-library android-developer-api
1个回答
0
投票

弄乱 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)
    }   
}
© www.soinside.com 2019 - 2024. All rights reserved.