我该如何在Android设备上查看SQLite数据库?

138
我有一个存储在SQLite数据库中的数据集。我需要在一个设备上查看这个数据库。我该如何做?
我已经检查了ddms模式。文件浏览器中的数据为空。

https://dev59.com/kWMl5IYBdhLWcg3wXF5f - Alex P.
尝试使用cordova-sqlite-devtools,这是一个开源CLI,用于从连接的Android设备中提取sqlite数据库。 https://www.npmjs.com/package/cordova-sqlite-devtools - Justin Lettau
1
我发现一个快速的方法,只需使用Google Chrome,这是它的视频。https://www.youtube.com/watch?v=fvkddnn9yps - Harpreet
如果你需要处理原始数据(adb,Python和pandas),请参考以下链接:https://dev59.com/36nka4cB1Zd3GeqPSbQB#49263211 - whoopdedoo
重要提示 如果您要按照Andy Cochrane的最受欢迎答案进行操作,请注意,最新版本的Firefox不支持SQLite Manager插件。您必须安装任何旧版本。我目前正在使用Firefox v 27,插件运行良好。您可以从这里获取Firefox的旧版本-https://ftp.mozilla.org/pub/firefox/releases/或者直接使用SQLite浏览器-http://sqlitebrowser.org/附言:由于有人关闭了此问题,因此必须将其添加为评论。 - Rupam Das
19个回答

192

以下是逐步指南(大部分内容摘自其他答案),即使是未root的设备也可以使用。

  1. 将您的设备连接并启动调试模式。

  2. 您可能希望使用 adb -d shell "run-as com.yourpackge.name ls /data/data/com.yourpackge.name/databases/" 命令查看数据库文件名。

注意: com.yourpackge.name 是您的应用程序包名称,您可以从清单文件中获取它。

  1. 将数据库文件从应用程序文件夹复制到SD卡中。

    adb -d shell "run-as com.yourpackge.name cat /data/data/com.yourpackge.name/databases/filename.sqlite > /sdcard/filename.sqlite"

注意: filename.sqlite 是您在创建数据库时使用的名称。

  1. 将数据库文件从设备拉取到计算机:

    adb pull /sdcard/filename.sqlite

这将把数据库从SD卡复制到ADB所在的位置。

  1. 安装Firefox SQLite Manager:https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/

  2. 打开Firefox SQLite Manager (工具->SQLite Manager) 并打开第3步中的数据库文件。

  3. 享受!


1
它起作用了,但我必须在第二步中将单引号替换为双引号。它不能使用单引号工作,但可以使用双引号(至少在Windows上)。 - Viachaslau Tysianchuk
3
它并不适用于所有设备(例如Nexus 9)。对于这些设备,我建议使用这个解决方案https://dev59.com/kWMm5IYBdhLWcg3wFL7s#29257875。 - kmalmur
4
需要注意的是,如果您想将数据库复制到SD卡中,您的应用程序(您正在“运行为”该应用程序)需要android.permission.WRITE_EXTERNAL_STORAGE权限。否则,它会告诉您“拒绝许可”。 - Lukas Knuth
12
想要提一下,我不能用“cat”命令将文件复制到SD卡中,而必须使用“cp”命令,否则在SD卡中会得到一个空文件。 - TheIT
1
不要使用 shell 参数,改用 exec-outshell 会干扰二进制数据,将 \n 转换为 \r\n,而 exec-out 是专门设计用于二进制数据传输的,不会破坏您的数据库文件,并且可以直接复制到您的电脑上,就像 adb -d exec-out "run-as com.example.app cat databases/example.db" 1> example.sqlite - Pavlus
显示剩余15条评论

87

2020年更新

数据库检查器(适用于Android Studio 4.1版本)。阅读Medium文章

对于较旧版本的Android Studio,我推荐以下3个选项

  1. Facebook的开源[Stetho库](http://facebook.github.io/stetho/)。从这里获取

在build.gradle中:

dependencies {
  // Stetho core
  compile 'com.facebook.stetho:stetho:1.5.1'        
  //If you want to add a network helper
  compile 'com.facebook.stetho:stetho-okhttp:1.5.1'
}

在应用程序对象中初始化库。
Stetho.initializeWithDefaults(this);

你可以在Chrome中通过chrome://inspect查看你的数据库。

  1. 另一个选择是这个插件(非免费)
  2. 最后一个选择是这个免费/开源库,可以在浏览器中查看数据库内容https://github.com/amitshekhariitbhu/Android-Debug-Database

如何在Eclipse中使用Stetho? - Istiaque Ahmed
1
在输入检查URL后,我并没有轻松地看到如何访问数据库。这是方法 - 在加载URL时,当您的应用程序已经运行时,加载的页面上会有一个带有“检查”文本的URL /链接,点击该链接..然后访问DB:1)观察开发人员工具窗口从浏览器弹出,2)单击“资源”选项卡,3)数据库位于左侧菜单中的“Web SQL”下。 - Gene Bo
1
这种解决方案的巨大优势在于,您还可以执行SQL INSERT和DELETE操作(这是基于adb pull的解决方案所不可能的)。所有更改都实时反映,因此您无需像使用基于adb pull的解决方案那样每次都复制数据库。 - Julien Kronegg
数据库毫无疑问是打开了,然而页面格式不符合标准。列重叠,屏幕反应缓慢。 - iCantC

65

目前我找到的最好的方法是使用Android-Debug-Database工具。

这个工具非常简单易用,只需要添加依赖并通过Web连接到设备数据库界面即可。不需要对手机进行root或添加其他活动等操作。以下是步骤:

步骤1

将以下依赖项添加到您的应用程序Gradle文件中并运行应用程序。

debugCompile 'com.amitshekhar.android:debug-db:1.0.0'

第二步

打开浏览器,访问手机的IP地址,端口为8080。URL应该像这样:http://YOUR_PHONE_IP_ADDRESS:8080。您将看到以下内容:

注意:您还可以通过调用DebugDB.getAddressLog();方法从代码中随时获取调试地址URL。

输入图像说明

我目前使用 Ping Tools 来获取手机的IP地址,但有很多其他选择。

第三步

就是这样!


更多详情请参阅官方文档: https://github.com/amitshekhariitbhu/Android-Debug-Database


谢谢,现在我可以通过远程获取SQLite了。这对公共地址也适用吗? - Denny Kurniawan
如果你得到了http://0.0.0.0:8080,那么请使用上面的adb转发选项。 - Jeffrey
只有通过 Android Studio 安装应用程序才能使之生效。如果您在设备上安装了已签名的 APK,这种方法对我来说是不起作用的 :( - lidox
@lindox这是因为你已经将其添加为gradle文件中的“debugImplementation”依赖项。请在gradle文件中使用“implementation”而不是“debugImplementation”。 - Bob
这是一个非常棒的工具!谢谢!! - Mark
显示剩余2条评论

54

管理和查看Android应用程序数据库的最佳方法是使用库DatabaseManager_For_Android

它是一个单独的Java活动文件;只需将其添加到源文件夹中即可。 您可以查看应用程序数据库中的表格,更新、删除、插入行到您的表格。全部在应用程序内部完成。

开发完成后,请从src文件夹中删除Java文件。就这样。

您可以观看5分钟演示,Database Manager for Android SQLite Database


这个能用来查看任何数据库(在sqllite中),还是只能查看你的应用程序创建的数据库? - Jasper
只有由您的应用程序创建的那个。 - sanath_p
这也适用于SQLiteAssetHelper。非常好用的工具! - Rm558
这大概花了我一个小时,希望对有需要的人有所帮助:如果你使用DBFlow,可以创建一个名为DummySQLiteOpenHelper的类,并将getData方法放入其中,然后像这样获取数据库:SQLiteDatabase sqlDB = ((AndroidDatabase)FlowManager.getWritableDatabase("Main")).getDatabase(); - androidguy

23
你可以这样做:
  1. adb shell
  2. cd /go/to/databases
  3. sqlite3 database.db
  4. sqlite> 提示符下,输入 .tables。这会给你数据库文件中的所有表格。
  5. select * from table1;

2
这个是有效的。路径为/data/data/COM.YOUR_PACKAGE.NAME/databases,其中COM.YOUR_PACKAGE.NAME是你想查看其数据库的包名。 然而第四个好像没有起作用。 - Mahsa2
感谢Mahsa Mohammadkhani,根据您在第2步中提到的内容,我已更新第4步,路径为应用数据路径。 - Deepu
5
可以的。进行步骤1后,你需要运行 'run-as PACKAGE.NAME',否则你将没有读取权限。这种方法有些有效。 - Mark Gjøl
这是正确的答案。好吧,不是最正确的答案,但绝对是最简单的答案,并且像魔法一样有效。 - fiatjaf
所以我尝试了以下操作:>> cd C:\Users\hp\AppData\Local\Android\Sdk\platform-tools ; >> adb shell >> cd data\data\com.myapp ... 它抛出了“权限被拒绝”的错误。 - pravingaikwad07
显示剩余2条评论

16
如果您正在使用未经Root的真实设备,则不可能在中看到您的数据库,因为由于某些安全原因,该文件夹已锁定在Android系统中。如果您在模拟器中使用它,则可以在中找到它,路径是/data/data/your package name/databases/yourdatabse.db

3
我已经取得了 root 权限,但是文件管理器中的数据仍然为空。 - John
什么是rooting @Abhijit的意思? - vivek
Root 意味着您拥有超级用户访问权限,就像在 Windows 中的管理员访问权限一样。 - Abhijit Chakra

7

试试 AndroidDBvieweR 吧!

  • 您的设备无需ROOT
  • 无需导入应用程序的数据库文件
  • 进行少量配置即可使用!

AndroidDBvieweR


2
不错的应用,但你需要在应用的 build.gradle 文件中添加一个依赖。 - Henrique de Sousa
1
添加依赖项只需要5秒钟。非常感谢Peter,这太棒了! - LifeQuestioner
2
不是每个人都想在项目中添加第三方库,尤其是因为这需要改变你的代码。 - Alberto M

4

我一直在使用SQLite数据库浏览器查看Android开发中的SQLite DB内容。您需要首先从设备中提取数据库文件,然后在SQLite DB浏览器中打开它。


我需要知道数据库文件的位置。我已经在文件浏览器中检查过了,但是数据为空,那么该从哪里获取数据库文件呢? - user
你是在使用模拟器还是真机?如果是真机,那么我猜 DDMS 不会列出内部存储(包括 /data)。但是,你可以使用 adb pull path_to_db_file_in_device path_to_save 将其保存到计算机上。 - Andrew T.
这只在模拟器上运行。 - Ojonugwa Jude Ochalifu
当从真实设备中提取数据库时,这种方法将无法正常工作,因为它将被加密。如果有人知道如何在“真实”数据库中使用此技术,请告诉我! - niczak
它可以工作,但是每次都要去/data/data/your-package-name/databases/yourdb.db路径下找文件很麻烦,如果能自动打开就更好了。 - DragonFire

4
尽管这不会直接查看您设备上的数据库,但我已发布了一个简单的shell脚本,用于将数据库转储到您的本地设备:

https://github.com/Pixplicity/dbdump

它执行了这里描述的两个不同的方法:

  1. 首先,它尝试使文件对其他用户可访问,并试图从设备中拉取它。
  2. 如果失败,则通过终端流式传输文件内容到本地计算机。它执行了一个额外的技巧,以删除某些设备输出到shell的\r字符。

从这里开始,您可以使用各种CLI或GUI SQLite应用程序,例如sqlite3sqlitebrowser,浏览数据库的内容。


非常困惑...你应该解释一下文件放在哪里,以及如何执行这些命令... 我在我的项目中进行了复制/粘贴,打开cmd并运行 humpty.sh -d com.mypak.name databases/MyDB.db 它说成功!... 但在 dumps/com.mypak.name/databases 文件夹中只有一个批处理文件,它说: run-as: Package 'com.mypak.name' is unknown - Choletski
@Choletski,它不应该输出批处理文件,这听起来像是一个错误。你是通过cygwin或mingw在Windows上执行shell脚本的吗?至于提取数据库,您可能希望自己通过adb shell执行命令,以查看您的设备是否支持“run-as”。 - Paul Lammertsma
1
运行得非常好。惊讶地没有人点赞这个!!谢谢! - everydayapps

3

按照以下步骤操作:

1>从这里下载*.jar文件。

2>将*.jar文件放入eclipse/dropins/文件夹中,并重新启动Eclipse。

3>在Eclipse右上角,单击DDMS图标。

4>在左侧面板中选择正确的模拟器。

5>在主面板的文件浏览器选项卡中,进入/data/data/[YOUR.APP.NAMESPACE]/databases目录。

6>在DDMS图标下方,当您选择数据库时,应该会出现一个新的蓝色数据库图标。单击它,您将看到一个Questoid Sqlite Manager选项卡打开以查看您的数据。

*注意:如果数据库没有变亮,可能是因为您的数据库没有*.db文件扩展名。请确保您的数据库称为[DATABASE_NAME].db

*注意:如果您想使用没有.db扩展名的DB:

-下载此Questoid SqLiteBrowser:从这里下载

-解压缩并将其放入eclipse/dropins(而不是Plugins)中。

-单击此处了解更多信息Click here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接