今天在逛技术网站的时候,看到了一个好东西,Database Inspector 第一眼看上去感觉没有用过,老样子赶紧百度一下,发现基本没有这方面的文章,看来这个应该是在内测还未推出的工具,首先说一下 Database Inspector 是干什么的?其实要解决的问题就是我们在调试数据库的时候,使它可以想编辑 Excel 一样的简单,直接修改直接生效,这有什么好处呢?不用我们在一点一点的去 Debug 数据了,这个看来还是非常有用的。
本来想找一些资料来整理一下,但无意间看到一个 Google 的大佬工程师已经分享了一篇教程,所以参考了一下然后简单的进行了翻译,废话不多说,一下就是具体使用方法,感兴趣的伙伴们可以看一下。以下是正文:
创建和管理本地数据库是大多数移动应用程序的核心组件。但是,无论直接使用 SQLite 还是通过 Room 持久性库使用,Android 开发人员一直在寻求一种更好的方法来检查和调试正在运行的应用程序中的数据库。
最新版本的 Android Studio 4.1(当前在Canary中可用)附带了一个名为 Database Inspector 的新工具, 该工具可帮助您检查,查询和修改正在运行的应用程序中的数据库。
使用 Database Inspector,修改数据库中的数据并不比编辑电子表格难。如果您正在使用 Room 并观察查询结果,更改将立即反映在您的 App 中!
在本文中,我们将结合使用 Database Inspector 和 Sunflower App 来测试一些极端情况。Sunflower 是一个园艺 App,用于说明 Android Jetpack 的 Android 开发最佳实践。在阅读本文时,我建议您克隆这个 Github 仓库。
首先
Sunflower App 的 UI 包含两个选项卡。要将一些植物添加到我的花园中,我们看一下 “Plant List” 选项卡,其中列出了我的花园中可用的植物。在右上角有一个过滤器按钮。当我按下此按钮时,将显示以下植物列表:
显然,此按钮可根据某些条件过滤植物。但是,让我们想象一下,我对这个项目不是很熟悉,我想通过使用数据库检查器来了解过滤的工作方式。
在 Android Studio 中打开数据库检查器,我需要从菜单栏中选择 View > Tool Windows > Database Inspector。
上一步动作会启动数据库检查器。
现在,我需要在运行 API 级别 26 或更高级别的设备上运行应用程序,然后从下拉菜单中选择应用程序进程。
选择要检查的应用程序过程后,数据库模式将显示在下面的面板中。要查看 Sunflower 数据库表,我需要扩展 …/ databases / sunflower-db schema。
让我们回到该 App,看看过滤后的植物列表。名单包括 Avocado,Grape,Orange 和 Tomato。如果我可以按植物名称对植物表进行排序,那么找到 Avocado 就不难了。让我们看看数据库检查器是否可以做到这一点!
首先,我双击 plants 表以显示其数据。数据显示的默认页面大小为 50,但是您可以在较短的结果列表之间减少此数字和页面。单击 name 列可将 plant 表按条目名称排序。果然,Avocado 不在列表的最下方,我在表的第二行中找到它。
查询数据库
查看 Avocado 的数据条目,growZoneNumber 最有可能是应用程序用于过滤的属性。为了验证这一点,让我们在growZoneNumber上运行查询,对于 Avocado而言 为 9 。实际上,该查询已经存在于 PlantDao.kt 中,我可以直接从 Room 的 @Query 批注中运行查询。每个 @Query 注释的行号旁边都有一个小运行图标。
当我单击查询 getPlantsWithGrowZoneNumber() 的运行图标并选择正确的数据库时,将出现一个弹出窗口,询问我:growZoneNumber 的值。
我可以输入值 9 并单击 “Run” 以查看查询结果。
另外,我可以键入自己的查询并在工具窗口中运行它。这给了我更多的可选择性,因为我不仅限于在 DAO 接口中定义的查询。要运行自己的查询,请单击 “Run SQL”,然后从右侧新打开的选项卡中选择 plants 数据库。
接下来,我在数据库选择下拉列表旁边的框中输入以下查询,然后点击Run。
" Select * from plants where growZoneNumber = 9 "
这里!我们具有与打开过滤器时完全相同的植物列表。
修改和调试数据库
数据库检查器允许您在应用程序在设备上运行时修改应用程序数据库中的值,从而轻松调试应用程序。
首先,我要测试应用程序用户界面中是否有很长的植物名称。我将使用 Database Inspector 直接在数据库上编辑值,而不是更改数据源并使用新数据刷新数据库。
现在该单元格是可编辑的,我将名称从 Apple 更改为一种非常特殊的 Apple 类型,然后按 Enter。如果您遵循此步骤,则可以在应用程序用户界面中键入任何您想要测试的长度的内容。
现在,让我们回到该 App。请注意,我们没有做任何事情,该应用程序将显示更新的数据!如果您的应用程序使用 Room 并观察到查询结果(using LiveData / Flow),则无需触发数据库查询即可刷新数据。否则,根据您的应用触发查询的方式,您可能需要重新启动该应用或仅再次导航到相关的活动/片段。为了充分发挥 Database Inspector 的潜能,这可能是迁移您的应用程序以使用 LiveData 或 Flow 的好借口。
回顾我们的应用程序,看似名片视图并非旨在处理如此长的植物名称。稍后将解决此问题,但让我们继续下一个测试。
每个植物都有不同的浇水间隔,我想看看何时浇水到期。为此,我需要在花园里添加一些植物。但是首先,我在数据库检查器中选中了 Live updates 复选框。当 Live updates 检查,数据库检查自动显示任何改变你的应用程序,使得它的数据库。
我回到 My Garden 选项卡,添加一些植物,例如 Avocado 和 Eggplant。但是首先,我回到 Database Inspector,双击 garden_plantings 观察表。请注意,在添加新植物时,garden_plantings 表中的数据是如何自动更新的。
这两种植物的浇水间隔均为 3 天。我真的不想等待 3 天才能看到会发生什么,所以我将编辑数据库并更改 last_watering_day。我再次回到 Database Inspector,然后双击 garden_plantings。该 last_watering_date 是表的最后一栏。我将两个记录的值更改为较小的值,以反映今天的某个日期之前的某个时间。
好的,看来我的时间倒退了一点,但这对于我的测试起了作用。应用界面似乎可以很好地显示截止日期。为了未来的发展,我们建议在浇水日过后为用户添加警告。
继续尝试新的数据库检查器!如果您遇到任何问题,请不要忘记提交错误!