繁体   English   中英

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

[英]How to check if data is inserted in Room Database

我在我的项目中使用来自新架构组件的房间数据库。 我正在通过 dao 添加一些数据,但是在尝试检索它时我没有得到它。 你能建议我如何检查插入是否成功吗? 以下是帮助您理解问题的代码。

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

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

插入后在此语句上从数据库中获取空值。

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

房间数据库

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

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

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

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

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

PS 我正在使用anko进行doAsync

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

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

编辑:AS 现在有一个内置的数据库工具

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

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

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

然后你可以查询你的表

关于插入有两种情况。

@Insert注释的 Dao 方法返回:

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

     @Insert suspend fun insert( student: Student): Long
  2. 如果输入是可变参数,它返回一个 LongArray,检查可变参数的大小是否等于 LongArray 的大小,如果为真,则项目添加成功

     @Insert suspend fun insert(vararg students: Student): LongArray

您可以通过多种方式对其进行测试。

  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);

//我的测试用例@Test 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));
}

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

按如下方式使用它:

  1. 将它作为debugImplementation依赖项包含在您应用程序的build.gradle中,这样它只会包含在调试版本中,而不包含在发布版本中:

     debugImplementation 'com.amitshekhar.android:debug-db:1.0.3'
  2. 启动您的应用程序的调试构建

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

     D/DebugDB: Open http://XXX.XXX.X.XXX:8080 in your browser
  4. 如果您通过 USB 运行应用程序,请设置端口转发:

     adb forward tcp:8080 tcp:8080

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

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

请注意,由于 Web 服务器在您的应用程序上下文中运行,因此无需对设备进行 root 即可正常工作。

最简单的方法之一是:

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

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

  3. 打开数据库浏览器(从左窗格窗口)并浏览您下载的数据库实例。 设置连接,你就可以浏览你的数据库了。

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

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

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

科特林文档

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

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

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

您可以在 GitHub 中查看我的示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM