【问题标题】:Android room database insert/update sequenceAndroid房间数据库插入/更新序列
【发布时间】:2021-11-14 00:43:24
【问题描述】:

我有一个带有 Room 数据库的应用程序,包括 DAO 和 Repository。事件顺序如下:

  1. 插入新行。
  2. 将行发送到服务器
  3. 更新该行以指示该行已发送。

问题是新行的 ID 在我发送到服务器之前或更新时并不总是可用的。因此,DAO 更新方法不起作用,因为它没有正确的 ID。
在我继续之前让插入返回 ID 是否有技巧?我知道这是在规避异步进程的好处,但在这种情况下可能是必要的。 我希望其他人可能已经解决了这个问题。

【问题讨论】:

  • 更新:由于新的 rowid 是异步生成的,我无法在更新中使用它,所以我决定在插入之前不使用自动生成的 ID 并将主键创建为 uniqueID。这样我就已经有了用于更新的密钥。 MikeT 下面的回答也有助于解决问题。

标签: database insert android-room


【解决方案1】:

问题是在我发送到服务器之前,新行的 ID 并不总是可用

对于 Room 中的表格,总是有一个值,如果通过便利 @Insert 插入行,则该值唯一标识可用的插入行(如果使用 @Query("INSERT INTO ....."),则情况不同)

  • 请注意,如果由于捕获/处理冲突而未插入行,则返回的值将为 -1。

在我继续之前让插入返回 ID 是否有技巧?

不是真正的技巧,至少如果 IDs 是整数类型,更多的是预期/预期的用法。只需让 insert Dao 返回 Long(如果 java 则返回 long)

例如(Java)

@Insert
long insert(TheEntity theEntity);

或(科特林)

@Insert
fun insert(theEntity: TheEntity): Long

返回的 Long/long 将是 rowid 列的值或其别名。

rowid 是所有表都有的列(除了那些用 WITHOUT ROWID 定义的表,Room 不允许),尽管它是一个隐藏列。如果您编写使用 @PrimaryKey 注释的整数类型,则该列将是 rowid 的别名。

  • 注意整数类型

    • 长长的,
    • 整数,整数,
    • 短,短,
    • 字节,字节,
    • 甚至,尽管它很无用,布尔值,布尔值。
  • 然而,Long,long 是 id 列最合适的值,因为 SQLite 可以存储相当于 Long/long 的 64 位有符号整数。因此,为什么插入只能返回 Long/long。

    • 不使用 Long/long SQLite 的好处是微乎其微的,它会将值存储在 1 字节到 8 字节的尽可能小的空间中。所以值 1 无论是 byte/short/int/long 在存储到数据库时都会占用一个字节。

    • 例如对于 Kotlin 代码 fun insert(toDoData: ToDoData): Int,你会得到 error: Not sure how to handle insert method's return type. public abstract int insert(@org.jetbrains.annotations.NotNull()

非整数 ID 类型/复合主键

其他列类型 String、Byte[]、Double、Float 等或复合主键,不会是 rowid 列的别名。要从这些其他类型中获取主键,您可以使用返回的 rowid,因为它对于该行是唯一的,然后获取主键,例如(对于@PrimaryKey val id: String)

@Query("SELECT id FROM todo_table WHERE rowid=:rowid" )
fun getPrimaryKeyByRowid(rowid: Long): String`

当然,您可以绕过获取 PrimayKey 值并传递,然后使用 rowid 值来确定要更新的行,但不使用 @Update 便捷方法/函数,而是使用@Query 更新为 UPDATE .... WHERE rowid=:passRowid。

【讨论】:

  • 谢谢!您的回答内容丰富。我想我学到的另一件事是我不必必须使用便利功能。你向我展示了如何做到这一点!
  • @Flatpick13 如果答案有帮助,请考虑勾选他们以接受答案。
猜你喜欢
  • 2021-06-19
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 2022-09-30
相关资源
最近更新 更多