2013-07-26 48 views
17

我正在開發一個應用程序,我使用sqllite3數據庫來存儲值。我有Nexus S和Nexus 7都是無根據的設備。如何獲取用於調試目的的應用程序的數據庫。如何檢查數據庫沒有紮根android設備

我已經嘗試 (1)我已經嘗試了所有的辦法提到here

adb shell 
run-as app.package.name \ 
cp /data/data/package.name/databases/application.sqlite /sdcard/ 
exit 
adb pull /sdcard/application.sqlite ~/ 

這是說沒有找到CP ..

(2)http://developer.android.com/tools/help/adb.html#sqlite

adb -s emulator-5554 shell 
# sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db 
SQLite version 3.3.12 
Enter ".help" for instructions 
.... enter commands, then quit... 
sqlite> .exit 
+0

http://stackoverflow.com/a/18472135/1778421 –

回答

28

你可以寫你的數據庫用以下的外部存儲器:

private void writeToSD() throws IOException { 
    File sd = Environment.getExternalStorageDirectory(); 

    if (sd.canWrite()) { 
     String currentDBPath = DB_NAME; 
     String backupDBPath = "backupname.db"; 
     File currentDB = new File(DB_PATH, currentDBPath); 
     File backupDB = new File(sd, backupDBPath); 

     if (currentDB.exists()) { 
      FileChannel src = new FileInputStream(currentDB).getChannel(); 
      FileChannel dst = new FileOutputStream(backupDB).getChannel(); 
      dst.transferFrom(src, 0, src.size()); 
      src.close(); 
      dst.close(); 
     } 
    } 
} 

哪裏DB_NAME是我的數據庫和DB_PATH的名稱定義如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     DB_PATH = context.getFilesDir().getAbsolutePath().replace("files", "databases") + File.separator; 
    } 
    else { 
     DB_PATH = context.getFilesDir().getPath() + context.getPackageName() + "/databases/"; 
    } 

,並添加以下權限(感謝@Sathesh指出這一點):

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

我隨時調用這個方法,我有一個數據庫寫入,以便我最新的數據庫文件在外部存儲器中,我可以查看它並從那裏調試。

然後,您可以使用X-Plore app從Android設備上的外部存儲器右側查看數據庫。

+2

您需要添加外部存儲權限<使用權限android:name =「android.permission.WRITE_EXTERNAL_STORAGE」/>。您可以使用「context.getDatabasePath(dbName).toString()」以編程方式獲取dbpath – Sathesh

+0

謝謝@Sathesh。我將編輯該部分。忘了它。 – TronicZomB

+0

我收到了原始數據庫文件的FILE NOT FOUND異常。我有一個無根的聯繫4.我已經交叉檢查了路徑。 – geekoraul

-1

您不能訪問沒有根深蒂固的設備

在/ data文件夾有沒有辦法做到這一點。 Android有很好的安全機制。只有您的應用可以訪問自己的文件。

+1

您仍然可以將數據庫複製到/ data之外的某個位置並在其中查看... – TronicZomB

+3

+1當設備被解除連接且應用程序處於非調試模式時,很難獲取應用程序數據......即使使用「run -as'它將失敗... – hayi

-2

這是不可能從一個根深蒂固的手機。你不能訪問/ data目錄,所以你不能像(2)那樣複製數據庫或者使用sqlite應用程序。如果您需要調試,請使用模擬器,或從您的應用運行查詢來檢查數據庫。

+0

你仍然可以將數據庫複製到/ data之外的某個地方並在那裏查看它... – TronicZomB

+2

@TronicZomB真的,你可以從你的應用程序那裏做到這一點,但有時候你不是能夠修改源文件。由於OP能夠修改源代碼,因此您的答案是最好的。 – Samuel

+0

對,如果是別人的應用程序,那麼您無法查看數據庫。 – TronicZomB

8

如果你不知道你的應用程序的路徑,那麼你可以使用這個:

public void copyAppDbToExternalStorage() throws IOException { 
    File sd = Environment.getExternalStorageDirectory(); 
    File currentDB = getApplicationContext().getDatabasePath("databaseName"); //databaseName=your current application database name, for example "my_data.db" 
    if (sd.canWrite()) { 
     File backupDB = new File(sd, "toDatabaseName"); // for example "my_data_backup.db" 
     if (currentDB.exists()) { 
      FileChannel src = new FileInputStream(currentDB).getChannel(); 
      FileChannel dst = new FileOutputStream(backupDB).getChannel(); 
      dst.transferFrom(src, 0, src.size()); 
      src.close(); 
      dst.close(); 
     } 
    } 
} 

或者,如果你需要複製數據庫公開「下載」文件夾中,那麼你可以使用這個:

public void copyAppDbToDownloadFolder() throws IOException { 
    File backupDB = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "toDatabaseName"); // for example "my_data_backup.db" 
    File currentDB = getApplicationContext().getDatabasePath("databaseName"); //databaseName=your current application database name, for example "my_data.db" 
    if (currentDB.exists()) { 
     FileChannel src = new FileInputStream(currentDB).getChannel(); 
     FileChannel dst = new FileOutputStream(backupDB).getChannel(); 
     dst.transferFrom(src, 0, src.size()); 
     src.close(); 
     dst.close(); 
    } 
} 

這在我的Nexus 4設備上完美運行。

3

我只需要做這樣的事情,有一種方法可以做到,儘管這是一種痛苦。您需要將該文件作爲應用程序的用戶帳戶進行捕獲,然後將其傳輸到可寫位置。這適用於我的Nexus 4運行4.3.3:

adb shell "run-as org.your.application cat /data/data/org.your.application/your-file > /mnt/sdcard/your-file" 
adb pull /mnt/sdcard/your-file 
+1

數據庫文件存儲在/ data/data//**數據庫中**/ camelCaseCoder

+0

也使用'cat',寫了一個空白文件。我用'cp '來得到它的工作。 – camelCaseCoder

+0

這也只適用於調試版本。嘗試運行 - 作爲發佈版本提供'run-as:包''不可調試' – jamsandwich

35

以下解決方案僅適用於可調試的應用程序。它可能無法在所有設備上正常運行,因爲run-as命令在某些設備上不起作用,尤其是在使用Jelly Bean的情況下。

  1. 創建* bat文件和複製以下腳本

    ADB殼運行爲[包]搭配chmod 777 /數據/數據/ [包] /數據庫/

    ADB殼運行爲[包]搭配chmod 777 /數據/數據/ [包] /數據庫/ [db_file_name]

    ADB殼運行爲[包] CP /數據/數據/ [包]/databa SES/[db_file_name]/SD卡/

    ADB拉/ SD卡/ [db_file_name]

  2. 變化[包]到所需的應用程序包

  3. 變化[db_file_name]到所需DB名稱運行bat文件,並 你應該看到複製的數據庫在同一文件夾中的蝙蝠 文件

上述解決方案假定:

  • 您使用的是Windows
  • 該設備在 「ADB設備」連接,並可見
+2

在華爲GRA-L09上完美運行!謝謝!這應該被接受爲答案。 – Anorflame

+0

如何找到db_file_name。它沒有這樣的文件或目錄 –

+0

@SergeyDirin您需要將名稱更改爲您在應用中設置的實際文件名稱 – kmalmur

0
adb shell "run-as CHR.Droid chmod 666 /data/data/CHR.Droid/files/CHR.db" 
adb shell cp /data/data/CHR.Droid/files/CHR.db /sdcard/ 

在Xamrin.forms我不得不更換數據庫文件

8

這裏有一個更簡單明瞭的答案:(測試Android上一個:無根

adb -d shell 
$ run-as my.package.name 
$ cp databases/mydatabase.db /sdcard/mydatabase.db 
$ exit 
$ exit 

現在拉你的數據庫的默認ADB路徑

adb -d pull /sdcard/mydatabase.db 

,或者到您的桌面例如

adb -d pull /sdcard/mydatabase.db C:\Users\user\Desktop 

你可能要與下面的命令刪除複製:如果有一個以上的模擬器

adb -d shell "rm /sdcard/mydatabase.db" 

-d選項選擇默認設備。

+4

這應該被接受回答 –

+0

這個方法是awesom。非常感謝。 – codeHunter

0

如果運行

adb shell "run-as your.package.name" 

後,您會收到「運行爲:包‘your.package.name’未知」,然後嘗試從模擬器獲得數據庫。請參閱:https://stackoverflow.com/a/44089632/2914140

在Android Studio 3中。0單擊查看>工具窗口>設備文件資源管理器。 展開/ data/data/[軟件包名稱]節點。