2010-11-17 12 views
6

Sto provando questo con il mio Nexus One. Ho l'SDK Android e ho usato il comando adb pull /data/data/com.myapp.android/databases C: \ pulls ma tutto quello che ottengo è pull: costruzione lista file ... 0 file tirati. 0 file saltati. Inoltre, sembra non importa quanti dati aggiungo all'app tutorial NotePad che ho installato, la dimensione dei dati per l'app (come mostrato in Impostazioni) non supera mai gli 8 KB. Com'è possibile? C'è un altro posto dove sono archiviati i database? Quando utilizzo la vista Esplora file (che fa parte di ADT) in Eclipse, vedo che non c'è niente in/data. Per aggiungere un tocco, non ho problemi a tirare altri file dal dispositivo. Sono solo database con cui ho problemi. Mi manca qualcosa? Grazie mille.Come posso estrarre database dal mio android sul mio desktop?

risposta

10

L'accesso alla memoria interna non è possibile a meno che il telefono non sia rootato. Un modo semplice è utilizzare l'emulatore e quindi è possibile ottenere i file. Per ottenere un database spegnere il dispositivo che ho scritto una piccola utility e mettere in alcuni di debug interfaccia utente per esso:

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

Grazie per aver condiviso il tuo codice. Inizialmente ho usato l'emulatore ma sono passato allo sviluppo sul mio telefono Nexus One Dev perché è molto più veloce in quel modo. La cosa strana è che il mio Nexus One è radicato. Quando avvio, vedo il lucchetto sbloccato nella parte inferiore dello schermo mentre carica Android. Questo non significa che dovrei essere in grado di eseguire i comandi di root? –

+2

Il codice sembra buono, ma Eclipse non riconosce la copia (currentDB, backupDB); istruzioni. Avete qualche libreria aggiuntiva (.jar) installata per usare il metodo di copia? – Rutger

+0

Hey dhaag23, potresti fornire l'implementazione del metodo di copia? –

0

Creare un file "pull.bat" nel desktop di Windows.

Nel file put:

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

Se si utilizza Mac o Linux provare questo script. Questo non richiede i permessi di 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 
Problemi correlati