2017-07-28 90 views
2

我正在使用我的項目中新架構組件的房間數據庫。 我正在通過dao添加一些數據,但是當試圖檢索它時,我沒有收到它。你能否建議我如何檢查插入是否成功?以下是幫助您理解問題的代碼。如何檢查數據是否插入到房間數據庫中

添加到數據庫,我用調試器檢查,這個語句執行成功。

appContext.db.rallyDAO().addVehicleListItem(vehicle) 

插入後在此語句中從數據庫獲取null。

val v = appContext.db.rallyDAO().getVehicleListItem(it.vehicleID) 

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 
} 

內部DAO

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

    @Query("select * from vehicles_submitted where vehicle_id LIKE :vehicleID") 
    fun getVehicleListItem(vehicleID:String):VehicleListItem 

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="" 
} 

回答

1

的問題是在線程。 房間不允許您在主線程中運行數據庫查詢。對插入方法的調用在try-catch塊內,我忽略了異常。 我修正了它,現在它是這樣讀取的。

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

而且,我回顧了documentation,插入方法(在傳遞給插入表的情況下,長期或列表)返回長。我也更改了插入的簽名,這裏是修改後的代碼

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

P.S.我正在使用anko作爲doAsync

2

你可以考慮,如果你還沒有訪問權限問題的選項,是導航directl y放入設備的sqlite實例中,並直接在那裏查詢表。

如果使用了Android Studio或有根的手機,你可以做以下intehgrated模擬器:

adb root 
adb remount 
cd data/data/path/of/your/application/database 
sqlite3 mydb.db 

然後你就可以查詢你的表

1

您可以使用Android Debug Database通過Web瀏覽器訪問應用程序的數據庫。 Android調試數據庫通過嵌入式Web服務器公開數據庫。

如下使用它:

  1. 之列爲debugImplementation依賴你的應用程序的build.gradle,這樣只會被包含在調試版本,而不是在發佈版本:

    debugImplementation 'com.amitshekhar.android:debug-db:1.0.3' 
    
  2. 開始您的應用程序的調試版本

  3. 嵌入式Web服務器自動啓動並聲明CES它的地址和端口日誌:

    D/DebugDB: Open http://XXX.XXX.X.XXX:8080 in your browser 
    
  4. 如果您正在運行在USB的應用程序,設置portforwarding:

    adb forward tcp:8080 tcp:8080 
    

    如果你沒有運行在USB的應用,在Android手機和工作站需要位於同一網絡中,並且工作站應能夠ping Android手機。

  5. 最後,從瀏覽器中的日誌中打開鏈接。

請注意,由於Web服務器在您的應用上下文中運行,因此無需設備生根即可使用。

相關問題