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注释进行注释的方法可以返回:
如果返回值为-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嗯,从来没有注意到,有点奇怪,它没有包含在在线文档中