2010-11-17 9 views
6

Estoy intentando esto con mi Nexus One. Tengo el SDK de Android y ha utilizado el comando adb /data/data/com.myapp.android/databases tracción C: \ tira pero todo lo que consigo es tirón: lista de archivos edificio ... 0 archivos sacaron. 0 archivos omitidos Además, parece que no importa cuántos datos agregue a la aplicación Notepad que instalé, el tamaño de los datos para la aplicación (como se muestra en Configuración) nunca supera los 8 KB. ¿Cómo es esto posible? ¿Hay algún otro lugar donde se almacenen las bases de datos? Cuando uso la vista Explorador de archivos (que es parte de ADT) en Eclipse, veo que no hay nada en/data. Para agregar un giro, no tengo problemas para sacar cualquier otro archivo del dispositivo. Solo tengo problemas con las bases de datos. ¿Me estoy perdiendo algo? Muchas gracias.¿Cómo puedo extraer las bases de datos de mi android en mi escritorio?

Respuesta

10

No es posible acceder al almacenamiento interno a menos que su teléfono esté rooteado. Una forma simple es usar el emulador y luego puedes obtener los archivos. Para la obtención de una base de datos fuera del dispositivo escribí una pequeña utilidad y poner en un cierto interfaz de usuario de depuración para ello:

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

Gracias por compartir su código. Inicialmente utilicé el emulador pero cambié al desarrollo en mi teléfono Nexus One Dev porque es mucho más rápido de esa manera. Lo extraño es que mi Nexus One está rooteado. Cuando arranque, veo el candado desbloqueado en la parte inferior de la pantalla mientras se carga Android. ¿No significa esto que debería poder ejecutar comandos raíz? –

+2

Tu código se ve bien, pero mi Eclipse no reconoce la copia (currentDB, backupDB); instrucción. ¿Tiene alguna biblioteca adicional (.jar) instalada para usar el método de copia? – Rutger

+0

Hola, dhaag23, ¿podrías proporcionar la implementación del método de copia? –

0

Crear un archivo "pull.bat" en su escritorio de Windows.

En el puesto archivo:

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

Si está utilizando MAC o Linux tratar este script. Esto no requiere permisos de 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 
Cuestiones relacionadas