检查行是否插入到 Room 数据库中

Check if row is inserted into Room database

我正在向 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。

请指教这种做法是否正确? 基本上,如果插入不成功,我想阻止用户继续

感谢您的建议和意见 R

你可以使用像this one

这样的数据库调试库

根据此处的文档 Room Dao @Insert

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

底线是, 用@Insert 注解注解的方法可以 return:

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

如果 return 值为 -1 或负数,根据 docs 考虑操作失败。

编辑回复@patrick.elmquist评论

来自房间生成的代码。 EntityInsertionAdapterSupportSQLiteStatement

/**
     * 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();