使用Room 持久性库创建数据库时,验证应用数据库和用户数据的稳定性非常重要。本页讨论如何测试数据库以及执行调试步骤以帮助您的测试通过。
测试您的数据库
有两种方法可以测试您的数据库
- 在 Android 设备上。
- 在您的主机开发机器上(不推荐)。
有关特定于数据库迁移的测试信息,请参阅测试迁移。
在 Android 设备上进行测试
测试数据库实现的推荐方法是编写在 Android 设备上运行的 JUnit 测试。由于这些测试不需要创建活动,因此它们的执行速度应该比您的 UI 测试快。
在设置测试时,应创建数据库的内存版本以使您的测试更可靠,如下例所示
Kotlin
@RunWith(AndroidJUnit4::class) class SimpleEntityReadWriteTest { private lateinit var userDao: UserDao private lateinit var db: TestDatabase @Before fun createDb() { val context = ApplicationProvider.getApplicationContext<Context>() db = Room.inMemoryDatabaseBuilder( context, TestDatabase::class.java).build() userDao = db.getUserDao() } @After @Throws(IOException::class) fun closeDb() { db.close() } @Test @Throws(Exception::class) fun writeUserAndReadInList() { val user: User = TestUtil.createUser(3).apply { setName("george") } userDao.insert(user) val byName = userDao.findUsersByName("george") assertThat(byName.get(0), equalTo(user)) } }
Java
@RunWith(AndroidJUnit4.class) public class SimpleEntityReadWriteTest { private UserDao userDao; private TestDatabase db; @Before public void createDb() { Context context = ApplicationProvider.getApplicationContext(); db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class).build(); userDao = db.getUserDao(); } @After public void closeDb() throws IOException { db.close(); } @Test public void writeUserAndReadInList() throws Exception { User user = TestUtil.createUser(3); user.setName("george"); userDao.insert(user); List<User> byName = userDao.findUsersByName("george"); assertThat(byName.get(0), equalTo(user)); } }
在主机上进行测试
Room 使用 SQLite 支持库,该库提供的接口与 Android Framework 类中的接口匹配。此支持允许您传递支持库的自定义实现来测试您的数据库查询。
测试您的迁移
Room 支持增量数据库迁移,以便在应用更新更改数据库模式的情况下保留现有应用数据。但是,定义错误的迁移可能会导致应用崩溃。请确保您测试您的 Room 数据库迁移。
调试数据库
您可以使用多种工具和流程来调试数据库。
使用数据库检查器
在 Android Studio 4.1 及更高版本中,数据库检查器允许您在应用运行时检查、查询和修改应用的数据库。数据库检查器与 Android 捆绑的 SQLite 版本兼容,并且包含可与 Room 一起使用的特殊功能。
- 使用代码行操作可快速运行来自DAO 类的查询。
- 当正在运行的应用更改数据时,立即在数据库检查器中查看实时更新。
要了解有关数据库检查器的更多信息,请参阅使用数据库检查器调试数据库。
从命令行转储数据
Android SDK 包含一个sqlite3
数据库工具,用于检查应用的数据库。它包括诸如.dump
之类的命令来打印表的內容,以及.schema
来打印现有表的SQL CREATE
语句。
您还可以从命令行执行 SQLite 命令,如下面的代码片段所示
adb -s emulator-5554 shell sqlite3 /data/data/your-app-package/databases/rssitems.db
有关更多信息,请参阅 SQLite 网站上提供的sqlite3
命令行文档。
其他资源
要了解有关测试和调试 Room 数据库的更多信息,请参阅以下其他资源
博客文章
视频
- 数据库检查器(11 周 Android)