[英]data inserted into external sqlite database but not saving in android studio
[英]How to get the live view of inserted data in Sqlite database on Android Studio
你能幫我解決這個問題嗎?
我正在向我的 Sqlite 數據庫中插入值。
如何檢查或查看插入的數據。
是否有任何工具或其他技術來顯示數據?
如果您想在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 擴展名保存文件。Tools -> SQLiteManager.
如果你在DDMS
上下載一個數據庫,那么你下載
DB.Browser.for.SQLite-3.10.1-win64
然后把database
文件放在這個軟件上,你就得到了數據。
我會更新我的答案,因為現在 Android Studio 3.1 中的 Android Studio 更新或更新到其他像現在 3.2 中的此 Studio DDMS功能不可用但別擔心我有另一個解決方案。
在你的 android Studio 中看到右下角有一個選項像設備文件資源管理器點擊這個按鈕
之后你可以看到如下圖在你的屏幕上打開:
現在選擇data -> data -> your project name.
:)
我不敢相信沒有人提到這個,但你可能正在尋找的是Android 調試數據庫
也適用於 Android Room,您可以查看、編輯表格和記錄。
盡管您批准了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因為我懶得記錄
DDMS 方法不適用於非 root 設備
我按照如何在未 root 的 android 設備上檢查數據庫將 Sqlite 數據庫從設備導入 PC。
按照給定的步驟操作:
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 查看器來查看拉取的數據庫。
注意:清單文件中需要兩個權限,否則數據不會復制到拉取的數據庫中
android.permission.WRITE_EXTERNAL_STORAGE android.permission.READ_EXTERNAL_STORAGE
您可以使用此庫(數據庫調試數據庫)添加、編輯、檢查所有數據庫表數據,包括您的共享首選項數據。點擊此鏈接進行安裝。
您需要做的就是放置依賴項,編譯並運行程序,您會在 logcat 中找到一個類似(your_package_name D/DebugDB: Open http://172.16.6.117:8081 in your browser)的鏈接,它將顯示所有您在瀏覽器上的數據庫
Android 應用程序最好的 Sqlite 調試工具是
臉書上的 Stetho
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.