2010-11-17 13 views
6

我試着用我的Nexus One。 我有Android SDK和已經使用的命令 ADB拉/data/data/com.myapp.android/databases C:\拉 但我得到的是 拉:建築文件列表... 0文件提取。跳過了0個文件。 此外,似乎無論添加到我安裝的教程NotePad應用程序的數據量如何,應用程序的數據大小(如設置中所示)都不會超過8KB。這怎麼可能?數據庫存儲有其他地方嗎?當我在Eclipse中使用文件資源管理器視圖(這是ADT的一部分)時,我看到/ data中沒有任何內容。 要添加一個扭曲,我沒有任何困難從設備拉任何其他文件。這只是我遇到麻煩的數據庫。 我錯過了什麼嗎?非常感謝。如何將我的android數據庫關閉到我的桌面上?

回答

10

除非您的手機是固定的,否則無法訪問內部存儲。一種簡單的方法是使用模擬器,然後您可以獲取文件。爲了得到一個數據庫關閉設備我寫了一個小工具,把一些調試UI吧:

private void backupDb() throws IOException { 
    File sd = Environment.getExternalStorageDirectory(); 
    File data = Environment.getDataDirectory(); 

    if (sd.canWrite()) { 

     String currentDBPath = "/data/com.yourcompany.yourapp/databases/yourapp.db"; 
     String backupDBPath = "/yourapp_logs/yourapp.db"; 

     File currentDB = new File(data, currentDBPath); 
     File backupDB = new File(sd, backupDBPath); 

     if (backupDB.exists()) 
      backupDB.delete(); 

     if (currentDB.exists()) { 
      makeLogsFolder(); 

      copy(currentDB, backupDB); 
     } 

     dbFilePath = backupDB.getAbsolutePath(); 
    } 
} 

private void makeLogsFolder() { 
    try { 
     File sdFolder = new File(Environment.getExternalStorageDirectory(), "/yourapp_logs/"); 
     sdFolder.mkdirs(); 
    } 
    catch (Exception e) {} 
    } 

private void copy(File from, File to) throws FileNotFoundException, IOException { 
    FileChannel src = null; 
    FileChannel dst = null; 
    try { 
     src = new FileInputStream(from).getChannel(); 
     dst = new FileOutputStream(to).getChannel(); 
     dst.transferFrom(src, 0, src.size()); 
    } 
    finally { 
     if (src != null) 
      src.close(); 
     if (dst != null) 
      dst.close(); 
    } 
} 
+0

感謝您分享您的代碼。最初我使用了仿真器,但轉而使用我的Nexus One Dev手機進行開發,因爲它的速度更快。奇怪的是我的Nexus One已經紮根。當我啓動時,我會在Android加載時看到屏幕底部的解鎖掛鎖。這不意味着我應該能夠執行root命令嗎? – 2010-11-22 17:50:40

+2

你的代碼看起來很好,但我的Eclipse不能識別副本(currentDB,backupDB);指令。 您是否安裝了一些額外的庫(.jar)以使用複製方法? – Rutger 2011-06-09 18:04:17

+0

嘿dagag23,你能否提供複製方法的實現? – 2011-09-01 20:53:48

0

創建您的Windows桌面「pull.bat」文件。

在文件的說:

db pull /data/com.APPNAME/databases/DBNAME.sqlite 
pause 
0

如果您使用的MAC或Linux試試這個腳本。這不需要root權限

#!/bin/bash 

REQUIRED_ARGS=2 
ADB_PATH=/Users/Tadas/Library/sdk/platform-tools/adb 
PULL_DIR="~/" 

if [ $# -ne $REQUIRED_ARGS ] 
    then 
     echo "" 
     echo "Usage:" 
     echo "android_db_move.sh [package_name] [db_name]" 
     echo "eg. android_db_move.sh lt.appcamp.impuls impuls.db" 
     echo "" 
    exit 1 
fi; 


echo"" 

cmd1="$ADB_PATH -d shell 'run-as $1 cat /data/data/$1/databases/$2 > /sdcard/$2' " 
cmd2="$ADB_PATH pull /sdcard/$2 $PULL_DIR" 

echo $cmd1 
eval $cmd1 
if [ $? -eq 0 ] 
    then 
    echo ".........OK" 
fi; 

echo $cmd2 
eval $cmd2 

if [ $? -eq 0 ] 
    then 
    echo ".........OK" 
fi; 

exit 0 
相關問題