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)
问题出在线程中。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我使用ANKO为doAsync
如果您没有访问权限问题,您可以考虑的一个选项是直接导航到设备的 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)
然后你可以查询你的表
关于插入有两种情况。
用@Insert注解的 Dao 方法返回:
如果输入只有一个数字,则返回一个 Long,检查该 Long 是否等于 1,如果为 true,则该 Item 添加成功。
@Insert
suspend fun insert( student: Student): Long
Run Code Online (Sandbox Code Playgroud)
如果输入是 varargs,它返回一个 LongArray,检查 varargs 的大小是否等于 LongArray 大小,如果 true 则项目添加成功
@Insert
suspend fun insert(vararg students: Student): LongArray
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15870 次 |
| 最近记录: |