2010-11-17 13 views
6

Ich versuche das mit meinem Nexus One. Ich habe das Android SDK und habe den Befehl adb verwendet pull /data/data/com.myapp.android/databases C: \ zieht aber alles, was ich bekomme, ist ziehen: Erstellen von Dateiliste ... 0 Dateien gezogen. 0 Dateien wurden übersprungen. Außerdem scheint es egal, wie viele Daten ich zu der von mir installierten Tutoring NotePad App hinzufüge, die Datengröße für die App (wie in den Einstellungen gezeigt) übersteigt niemals 8KB. Wie ist das möglich? Gibt es einen anderen Ort, wo Datenbanken gespeichert sind? Wenn ich die Ansicht des Datei-Explorers (die Teil von ADT ist) in Eclipse verwende, sehe ich, dass in/data nichts ist. Um einen Twist hinzuzufügen, habe ich keine Probleme, andere Dateien aus dem Gerät zu ziehen. Es sind nur Datenbanken, mit denen ich Probleme habe. Fehle ich etwas? Vielen Dank.Wie kann ich Datenbanken von meinem Android auf meinen Desktop ziehen?

Antwort

10

Der Zugriff auf den internen Speicher ist nur möglich, wenn das Telefon gerootet ist. Eine einfache Möglichkeit besteht darin, den Emulator zu verwenden, und dann können Sie die Dateien abrufen. Für immer eine Datenbank aus dem Gerät habe ich ein kleines Programm und für sie in einigem Debug-UI setzen:

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

Vielen Dank für die Freigabe Ihres Codes. Anfangs benutzte ich den Emulator, wechselte aber zur Entwicklung meines Nexus One Dev-Telefons, weil es so viel schneller ist. Was komisch ist, ist mein Nexus One ist verwurzelt. Wenn ich hochfährt, sehe ich das entsperrte Vorhängeschloss am unteren Bildschirmrand, während Android lädt. Bedeutet das nicht, dass ich Root-Befehle ausführen könnte? –

+2

Ihr Code sieht gut aus, aber mein Eclipse erkennt die Kopie nicht (currentDB, backupDB); Anweisung. Haben Sie eine zusätzliche Bibliothek (.jar) installiert, um die Kopiermethode zu verwenden? – Rutger

+0

Hey dhaag23, könnten Sie bitte die Implementierung der Kopiermethode bereitstellen? –

0

erstellen „pull.bat“ Datei in Ihrem Windows-Desktop.

In der Datei Put:

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

Wenn Sie MAC oder Linux verwenden versuchen, dieses Skript. Dies erfordert keine Root-Berechtigungen

#!/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