Android 检查行是否插入到房间数据库中

Android 检查行是否插入到房间数据库中,android,kotlin,android-room,android-database,suspend,Android,Kotlin,Android Room,Android Database,Suspend,我正在将行插入房间数据库,我想检查该行是否已成功插入 这是我的刀 @Insert() suspend fun insertOfflineData(offlineData: OfflineData): Long @Entity data class OfflineData( @PrimaryKey(autoGenerate = true) val id: Int = 0, @ColumnInfo(name = "request_info_json")

我正在将行插入房间数据库,我想检查该行是否已成功插入

这是我的刀

@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

根据此处的文档,您可以使用类似于

的数据库调试库

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

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

  • 单个插入操作的长值
  • 多个插入操作的长[]或长[]或列表
  • 如果不关心插入的id,则为void
  • 如果返回值为-0或1,则考虑操作失败。 编辑回复@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();
    

    好的,当新行添加到db中时,Room将始终返回此行的primaryKey值,即Long。如果您选择了
    autoGenerate=true
    room将生成该行,否则您必须指定它。我要检查的是,如果结果为>0,则表示room已成功插入该行,否则将不成功~这种方法在检查我的数据是否成功保存在文件室中时正确吗?rowId ok,那么你的意思是永远不会发生这种情况吗?现在我不确定你预期的失败类型,但你可以为插入指定冲突策略,如果它与冲突无关,我很确定会引发异常。我不认为你可以根据rowId的值做出假设,除非你收到一个插入成功感谢你的响应,因为调试这么好,但我检查的目的不是调试,而是阻止用户在应用程序中继续进行我很好奇,因为我也阅读了文档,你在哪里找到负数部分的?当我在页面中搜索-1、负或负时,找不到任何内容。@patrick.elmquist我更新了答案。请检查我看到的包是
    包androidx.sqlite.db,这确实是Room包的一部分吗?是的,您可以转到java(生成的)文件夹,导航到dao类impl并检查实现。它的same@Jayanth嗯,从来没有注意到,有点奇怪,它没有包含在在线文档中