如何在 Android Studio 上获取 Sqlite 数据库中插入数据的实时视图
Posted
技术标签:
【中文标题】如何在 Android Studio 上获取 Sqlite 数据库中插入数据的实时视图【英文标题】:How to get the live view of inserted data in Sqlite database on Android Studio 【发布时间】:2018-08-19 10:01:48 【问题描述】:请你帮我解决这个问题。
我正在向我的 Sqlite 数据库插入值。
如何检查或查看插入的数据。
是否有任何工具或其他技术可以显示数据?
【问题讨论】:
搜索关于内容提供者 您想在.db
文件中查看该数据还是想在应用中显示?
您要记录的写作联系人 :) @BivinVinod
请参考这个,***.com/questions/19194576/…
使用安卓设备监视器从数据文件夹中获取数据库。然后使用 sqlite 浏览器打开 .db 文件。从此链接下载:sqlitebrowser.org
【参考方案1】:
如果您想在 Log
上显示数据,请尝试以下代码:
for (Contact cn : contacts)
String log = "Id: "+cn.getID()+" ,Name: " + cn.getName() + " ,Phone: " + cn.getPhoneNumber();
// Writing Contacts to log
Log.d("Name: ", log);
显示database
的其他方式请参见以下步骤:
-
转到
Tools -> DDMS
或单击工具栏中 SDK 管理器旁边的设备监视器图标。
设备监视器窗口将打开。在文件资源管理器选项卡中,单击data -> data -> your project name.
之后,您的数据库文件将打开。点击pull a file from device icon.
使用.db扩展名保存文件。
打开 FireFox,按 Alt,Tools -> SQLiteManager.
关注数据库 -> 连接到数据库 -> 浏览您的数据库文件并单击确定。您的 SQLite 文件现在将打开。
如果您在 DDMS
上下载数据库,那么您下载
DB.Browser.for.SQLite-3.10.1-win64
把database
文件放到这个软件上就可以得到数据了。
DDMS 的新更新
我将更新我的答案,因为现在 android Studio 3.1 中的 Android Studio 更新或此 Studio 中的其他类似现在 3.2 DDMS 功能不可用,但别担心,我还有另一个解决方案。
在您的 android Studio 中查看右侧底角有一个选项,如 设备文件资源管理器单击此按钮
之后,您可以看到如下图在您的屏幕上打开:
现在选择data -> data -> your project name.
:)
【讨论】:
【参考方案2】:DDMS 方法不适用于非 root 设备
我跟随How to check database on not rooted android device将Sqlite DB从设备导入PC。
按照给定的步骤:
-
在 Android Studio 中打开终端
将默认目录更改为 your_path_to>SDK>platform-tools>
adb shell run-as [package] chmod 777 /data/data/[package]/databases/
adb shell run-as [package] chmod 777 /data/data/[package]/databases/[db_file_name]
adb shell run-as [package] cp /data/data/[package]/databases/[db_file_name] /sdcard/
adb pull /sdcard/[db_file_name]
4.检查文件夹sdk>platform-tools中拉取的SQLite DB
现在您可以使用任何 SQLite 查看器来查看拉取的数据库。
注意:Manifest 文件需要两个权限,否则数据不会复制到拉取的数据库中
android.permission.WRITE_EXTERNAL_STORAGE android.permission.READ_EXTERNAL_STORAGE
【讨论】:
【参考方案3】:我不敢相信没有人提到这一点,但您可能正在寻找的是Android Debug Database
也适用于 Android Room,您可以查看、编辑表格和记录。
【讨论】:
【参考方案4】:虽然你批准了Cassius Clay's
的回答,但如果你需要处理原始数据
不需要root(如果它不在sdcard上,请按照@Ankit的回答)
import os
import sys
import subprocess
import sqlite3
import pandas as pd
arg_folder = sys.argv[1] # root folder to recursively search db files from
output_lines = subprocess.check_output(['adb', 'shell', ('ls -R %s' % arg_folder)]).decode('utf-8').splitlines()
db_files = []
current_folder = ''
for line in output_lines:
"""
Output example for 'ls -R /data/data':
/data/data/org.fdroid.fdroid/files/fdroid/repo/icons:
/data/data/org.fdroid.fdroid/shared_prefs:
apks-pending-install.xml
org.fdroid.fdroid_preferences.xml
/data/data/ru.meefik.busybox:
cache
files
lib
shared_prefs
if line contains '/' it's a directory, we want to extract the full path for '.db' files
"""
if line.__contains__('/'):
current_folder = line
elif line.endswith('.db'):
db_files.append('%s/%s' % (current_folder[:-1], line))
print("Listing databases..")
while True:
try:
for idx, full_path in enumerate(db_files):
print(") ".format(idx + 1, full_path))
i = input("Enter database number : ")
db = db_files[int(i) - 1] # selected database
subprocess.check_output(['adb', 'pull', db]) # pulling the .db file from device to local
db = db.split('/')[-1] # "/data/data/com.app/folder/private.db".split('/')[-1] = private
conn = sqlite3.connect(db)
# getting list of current database tables
tables = conn.execute("SELECT name FROM sqlite_master WHERE type='table';").fetchall()
for table in tables:
table = table[0] # little fix, it comes as a tuple
print('%s%s' % (db[:-2], table))
with pd.option_context('display.width', 1000): # setting terminal width to view all table columns inline
print(pd.read_sql_query("SELECT * FROM %s" % table, conn)) # print table content
print('- ' * 50) # table print separator
# cleanup
if input('remove database file (from local) [y/N] ? ').lower() == 'y':
print('removing ', db)
os.remove(db)
# repeat
c = input("Press ENTER to continue or CTRL+C to Quit..")
except KeyboardInterrupt:
exit(0)
这是一个不太人性化的超长单行
read -p "enter root folder to recursively search db files from: " f;dbs=( $(adb shell ls -R $f |
while read line
do
line=$(echo $line | tr -d '\r')
if [[ "$line" =~ ^/.*:$ ]]
then
dir=$line%:
elif [[ "$line" = "opendir failed" ]]
then
echo "$dir - permission denied"
else
if [[ "$dir" = "/" ]]; then dir=""; fi
echo "$dir/$line" | grep '\.db$'
fi
done)
);echo $dbs[@]; dbs+=(exit);select db in "$dbs[@]"; do
[[ $db == exit ]] && break
echo "You have chosen $db"
adb pull $db
python -c 'import sqlite3;import pandas as pd;db=sqlite3.connect("'$db##*/'");tables=db.cursor().execute("SELECT name FROM sqlite_master WHERE type=\"table\";").fetchall();print([pd.read_sql_query("SELECT * FROM %s" % t[0], db) for t in tables]);'
done
GIF 因为我懒得记录
【讨论】:
【参考方案5】:您可以使用此库(数据库调试数据库)添加、编辑、检查所有数据库表数据,包括您的 sharedpreferences 数据 Follow this link to install.
您需要做的就是放置依赖项,编译并运行程序,您会在 logcat 中找到一个类似 (your_package_name D/DebugDB: Open http://172.16.6.117:8081 in your browser) 的链接,它将显示您所有的数据库浏览器
【讨论】:
【参考方案6】:android应用最好的Sqlite调试工具是
Stetho 来自 Facebook
http://facebook.github.io/stetho/
Stetho 是适用于 Android 应用程序的复杂调试桥。启用后,开发人员可以访问 Chrome 桌面浏览器原生的 Chrome 开发人员工具功能。开发人员还可以选择启用可选的 dumpapp 工具,该工具为应用程序内部提供强大的命令行界面。
下载或您也可以通过 Gradle 或 Maven 从 Maven Central 包含 Stetho。
// Gradle dependency on Stetho
dependencies
compile 'com.facebook.stetho:stetho:1.5.1'
<dependency>
<groupid>com.facebook.stetho</groupid>
<artifactid>stetho</artifactid>
<version>1.5.1</version>
</dependency>
只有主要的 stetho 依赖是严格要求的,但是您也可能希望使用其中一个网络助手:
dependencies
compile 'com.facebook.stetho:stetho-okhttp3:1.5.1'
或者
dependencies
compile 'com.facebook.stetho:stetho-okhttp:1.5.1'
或者
dependencies
compile 'com.facebook.stetho:stetho-urlconnection:1.5.1'
集成
设置
与 Stetho 集成旨在为大多数现有 Android 应用程序提供无缝且直接的操作。在您的Application class:
public class MyApplication extends Application
public void onCreate()
super.onCreate();
Stetho.initializeWithDefaults(this);
这会调出大部分默认配置,但不会启用一些额外的钩子(最值得注意的是,网络检查)。有关各个子系统的具体详细信息,请参见下文。
Enable Network Inspection
如果您在 2.2.x+ 或 3.x 版本中使用流行的 OkHttp 库,您可以使用拦截器系统自动挂钩到您现有的堆栈。这是目前启用网络检查的最简单、最直接的方法。
对于 OkHttp 2.x
OkHttpClient client = new OkHttpClient();
client.networkInterceptors().add(new StethoInterceptor());
对于 OkHttp 3.x
new OkHttpClient.Builder()
.addNetworkInterceptor(new StethoInterceptor())
.build();
由于拦截器可以修改请求和响应,因此在所有其他拦截器之后添加 Stetho 拦截器以获得网络流量的准确视图。
如果您使用HttpURLConnection
,您可以使用StethoURLConnectionManager
来协助集成,但您应该知道这种方法有一些注意事项。特别是,您必须将Accept-Encoding: gzip
显式添加到请求标头并手动处理压缩响应,以便 Stetho 报告压缩的有效负载大小。
更多信息请访问stetho
【讨论】:
以上是关于如何在 Android Studio 上获取 Sqlite 数据库中插入数据的实时视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Ubuntu 上安装 Android Studio?
Sqlite表在小米Note 7s上不创建,但在其他手机和Android Studio中的虚拟设备上创建。
如何在 Android Studio 中使用 Kotlin 从 Firestore 数据库中获取下一条和上一条数据?
Android Studio,ArrayList+Search Bar,如何获取正确的Activity