【问题标题】:Check if row is inserted into Room database检查是否将行插入到 Room 数据库中
【发布时间】:2020-10-23 11:03:39
【问题描述】:

我正在向 Room 数据库插入行,我想检查该行是否插入成功。

这是我的道

@Insert()
suspend fun insertOfflineData(offlineData: OfflineData): Long

@Entity
data class OfflineData(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    @ColumnInfo(name = "request_info_json")
    val requestInfoJson: String
)

当我插入一行时,响应是 1,2,3 等等.. 所以它返回的是id(对吗?)

所以要检查行是否插入正确。

我可以检查插入的 rowId 是否大于 0,然后它已成功插入数据库。

private suspend fun insertOfflineData(offlineDataRequestInfo: String): Long {
        var result: Long = 0
        result = OfflineDatabaseManager.getInstance(app.applicationContext).insertOfflineData(
            OfflineData(
                0,
                offlineDataRequestInfo
            ))
        if(result > 0 ) {
            //SUCCEFFLULLY INSERTED
        } else {
            //UNSUCCESSFULL
        }
        return result
    }

注意:我得到的结果是 1、2、3 等,应该是 rowId。

请建议这种方法是否正确? 基本上,如果插入不成功,我想阻止用户进一步进行

感谢您的建议和意见 回复

【问题讨论】:

  • AFAIK,当新行添加到 db 时,Room 将始终返回该行的 primaryKey 值,即 Long。如果您选择autoGenerate=true room 将生成它,否则您必须指定它。
  • 我要检查的是,如果结果 > 0,则表示房间成功插入了行,如果不是,则表示不成功。 ~这种方法在检查我的数据是否成功保存在房间里是否正确?
  • rowId
  • 好吧,你的意思是这永远不会发生?
  • 现在我不确定您期待什么样的失败,但您可以为插入指定冲突策略,如果它与冲突无关,我很确定会引发异常。我认为您不能根据 rowId 的值做出假设,除非您收到插入成功的值

标签: android kotlin android-room android-database suspend


【解决方案1】:

根据此处的文档Room Dao @Insert

如果@Insert 方法只接收1 个参数,它可以返回一个long,即插入项的新rowId。如果参数是数组或集合,则应返回 long[] 或 List。

底线是, 使用@Insert 注解注解的方法可以返回:

  1. 单次插入操作的长值。
  2. 一个 long[] 或 Long[] 或 List 用于多个插入操作。
  3. 如果您不关心插入的 ID,则无效。

如果返回值为-1或负数,则根据docs认为操作失败。

编辑回答@patrick.elmquist 评论

来自房间生成的代码。 EntityInsertionAdapter 和 SupportSQLiteStatement

/**
     * Execute this SQL statement and return the ID of the row inserted due to this call.
     * The SQL statement should be an INSERT for this to be a useful call.
     *
     * @return the row ID of the last row inserted, if this insert is successful. -1 otherwise.
     *
     * @throws android.database.SQLException If the SQL string is invalid for
     *         some reason
     */
    long executeInsert();

【讨论】:

  • 我很好奇,因为我也阅读了文档,您在哪里找到关于负数的部分?当我在页面中搜索 -1、负数或负数时找不到任何内容。
  • @patrick.elmquist 我更新了答案。请检查
  • 我看到包裹是package androidx.sqlite.db;,这确定是Room 包裹的一部分吗?
  • 是的,您可以转到 java(generated) 文件夹并导航到您的 dao 类 impl 并检查实现。一样的
  • @Jayanth huh 从来没有注意到,有点奇怪,它没有包含在在线文档中
【解决方案2】:

你可以使用像this one这样的数据库调试库

【讨论】:

  • 感谢您的回复,调试了这么好的东西,但我检查的目的不是调试,而是阻止用户在应用程序中继续进行
猜你喜欢
  • 2021-02-12
  • 1970-01-01
  • 2015-09-22
  • 2018-01-04
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 2023-01-21
  • 1970-01-01
相关资源
最近更新 更多