如何检查是否在Room Database中插入了数据

Riv*_*rty 8 android kotlin android-room

我在我的项目中使用来自新架构组件的Room Database.我通过dao添加一些数据,但是当我尝试检索它时,我没有得到它.能否请您建议我如何检查插件是否成功?以下是帮助您了解问题的代码.

添加到数据库,我用调试器检查,这个语句执行成功.

appContext.db.rallyDAO().addVehicleListItem(vehicle)
Run Code Online (Sandbox Code Playgroud)

插入后在此语句上从数据库获取null.

val v = appContext.db.rallyDAO().getVehicleListItem(it.vehicleID)
Run Code Online (Sandbox Code Playgroud)

RoomDatabase

@Database(entities = arrayOf(Rally::class, Route::class, CheckPoints::class, Vehicles::class, VehicleListItem::class), version = 1)
abstract class TSDRoom: RoomDatabase() {
    public abstract fun rallyDAO():RallyDAO
}
Run Code Online (Sandbox Code Playgroud)

里面的DAO

@Insert(onConflict = OnConflictStrategy.REPLACE)
    fun addVehicleListItem(vehicleListItem:VehicleListItem)

    @Query("select * from vehicles_submitted where vehicle_id LIKE :vehicleID")
    fun getVehicleListItem(vehicleID:String):VehicleListItem
Run Code Online (Sandbox Code Playgroud)

VehicleListItem实体

@Entity(tableName = "vehicles_submitted",
        foreignKeys = arrayOf(ForeignKey(entity = Rally::class,
                parentColumns = arrayOf("rally_id"),
                childColumns = arrayOf("rally_id"))))
class VehicleListItem {
    @PrimaryKey
    @ColumnInfo(name = "vehicle_id")
    @SerializedName("vehicle_id")
    var vehicleID : String = ""
    @ColumnInfo(name = "driver_id")
    @SerializedName("driver_id")
    var driverID : String = ""
    @ColumnInfo(name = "vehicle_name")
    @SerializedName("vehicle_name")
    var vehicleName : String = ""
    @ColumnInfo(name = "driver_name")
    @SerializedName("driver_name")
    var driverName : String = ""
    @ColumnInfo(name = "driver_email")
    @SerializedName("driver_email")
    var driverEmail : String = ""

    @ColumnInfo(name = "rally_id")
    @SerializedName("rally_id")
    var rallyID: String = ""

    @ColumnInfo(name = "is_passed")
    @SerializedName("is_passed")
    var isPassed = false

    @ColumnInfo(name = "passing_time")
    @SerializedName("passing_time")
    var passingTime:String=""
}
Run Code Online (Sandbox Code Playgroud)

Riv*_*rty 6

问题出在线程中。Room不允许您在主线程中运行数据库查询。对insert方法的调用在try-catch块内部,而我忽略了该异常。我修复了它,这就是现在的读法。

doAsync {
                        val addedID = appContext.db.rallyDAO().addVehicleListItem(vehicle)
                        Logger.d("vehicle_lsit_item","Inserted ID $addedID")
        }
Run Code Online (Sandbox Code Playgroud)

另外,我查看了文档,insert方法可能返回Long(如果将List传递给insert,则可能返回Long的List)。我还更改了插入的签名,这是修改后的代码

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun addVehicleListItem(vehicleListItem:VehicleListItem):Long
Run Code Online (Sandbox Code Playgroud)

PS我使用ANKOdoAsync


Ege*_*glu 6

您可以使用Stetho在chrome dev工具中查看您的数据库和共享pref文件

http://facebook.github.io/stetho/


Fab*_*bio 5

如果您没有访问权限问题,您可以考虑的一个选项是直接导航到设备的 sqlite 实例并直接在那里查询表。

如果您使用与 Android Studio 或 root 手机集成的模拟器,您可以执行以下操作:

adb root
adb remount
cd data/data/path/of/your/application/database
sqlite3 mydb.db
Run Code Online (Sandbox Code Playgroud)

然后你可以查询你的表


هيث*_*يثم 5

关于插入有两种情况。

用@Insert注解的 Dao 方法返回:

  1. 如果输入只有一个数字,则返回一个 Long,检查该 Long 是否等于 1,如果为 true,则该 Item 添加成功。

     @Insert
     suspend fun insert( student: Student): Long
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果输入是 varargs,它返回一个 LongArray,检查 varargs 的大小是否等于 LongArray 大小,如果 true 则项目添加成功

     @Insert
     suspend fun insert(vararg students: Student): LongArray
    
    Run Code Online (Sandbox Code Playgroud)