如何检查房间数据库中是否插入了数据

时间:2017-07-28 07:17:35

标签: android kotlin android-room

我正在使用项目中新架构组件的Room Database。 我通过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=""
}

7 个答案:

答案 0 :(得分:6)

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

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

另外,我查看了documentation,insert方法可能会返回Long(如果List传递给insert,则返回Long列表)。我还更改了insert的签名,这里是修改后的代码

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

P.S。我使用anko作为doAsync

答案 1 :(得分:6)

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

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

答案 2 :(得分:3)

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

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

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

然后你可以查询表格

答案 3 :(得分:3)

有多种方法可以测试它。

  1. 正如@Ege Kuzubasioglu所提到的,您可以使用stetho手动检查(需要对代码进行细微更改)。
  2. 将数据库文件从“data / data / yourpackage / databases / yourdatabase.db”提取到本地计算机,并使用任何应用程序读取数据库中的内容。我个人使用https://sqlitebrowser.org/。 拉数据库文件可以使用shell命令完成,也可以使用android studio中的“设备文件浏览器”。

  3. 编写TestCase以查看它是否正常工作。以下是我的一个项目的测试用例示例。

    //来自我的DAO类的代码

      

    @Insert(onConflict = OnConflictStrategy.REPLACE)        public abstract Long [] insertPurchaseHistory(List MusicOrders);

  4. //我的测试用例      @测试     public void insertPurchaseHistoryTest(){

        // Read test data from "api-responses/music-purchase-history-response.json"
        InputStream inputStream = getClass().getClassLoader()
                .getResourceAsStream("api-responses/music-purchase-history-response.json");
        // Write utility method to convert your stream to a string.
        String testData = FileManager.readFileFromStream(inputStream);
    
        // Convert test data to "musicOrdersResponse"
        MusicOrdersResponse musicOrdersResponse = new Gson().fromJson(testData,MusicOrdersResponse.class);
    
        // Insert inmateMusicOrders and get the list of
        Long[] rowsInserted = tracksDao.insertPurchaseHistory(musicOrdersResponse.getmusicOrders());
        assertThat(rowsInserted.length,Matchers.greaterThan(0));
    }
    

答案 4 :(得分:2)

您可以使用Android Debug Database通过网络浏览器访问应用程序的数据库。 Android调试数据库通过嵌入式Web服务器公开数据库。

按如下方式使用:

  1. 将其作为/images/cat.png依赖项添加到您应用的/favicon.ico中,以便它只包含在调试版本中,而不包含在发布版本中:

    debugImplementation
  2. 启动应用的调试版本

  3. 嵌入式Web服务器自动启动并在日志中公布其地址和端口:

    build.gradle
  4. 如果您通过USB运行应用程序,请设置端口转发:

    debugImplementation 'com.amitshekhar.android:debug-db:1.0.3'
    

    如果您没有通过USB运行应用程序,则您的Android手机和工作站需要位于同一网络中,而您的工作站应能够ping通Android手机。

  5. 最后,从浏览器中的日志中打开链接。

  6. 请注意,在Web服务器在您的应用程序上下文中运行时,它可以正常工作而不会使设备生根。

答案 5 :(得分:1)

最简单的方法之一是:

  1. 首先在Android Studio中将DB Navigator作为插件下载(有关更多信息,请访问https://plugins.jetbrains.com/plugin/1800-database-navigator)。

  2. 转到查看>“工具”窗口>“设备文件”资源管理器并下载数据库实例。

  3. 打开数据库浏览器(从左侧窗格窗口)并浏览已下载的数据库实例。设置连接,您将可以很好地浏览数据库。

  4. 有关更多信息,请参阅上面提供的链接。

答案 6 :(得分:0)

我这样做(我使用协程suspend):

class SaveVehicle(val repository: RepositoryInterface) {
    suspend fun invoke(vehicleListItem: VehicleListItem): VehicleListItem = 
        with(vehicleListItem) {
           also {
                 repository.saveVehicle(vehicleListItem)
           }
        }
}

Kotlin文档

inline fun <T> T.also(block: (T) -> Unit): T

以该值作为参数调用指定的功能块并返回该值。

also适用于执行一些将上下文对象作为参数的操作。将also用于需要引用而不是对象而不是其属性和功能的操作,或者当您不想从外部范围隐藏此引用时。

您可以检查my example in GitHub

相关问题