Depuración de la base de datos sqlite en el dispositivo

Actualmente estoy trabajando en una aplicación WiFi para Android. Tengo problemas para intentar acceder a la base de datos en el dispositivo. La depuración en el emulador no funciona para mí, porque no hay soporte WiFi en el emulador. Intenté sacar el archivo de la base de datos del dispositivo usando

adb pull data/data/package-name/databases/database-name 

Pero recibo el error “Permiso denegado”. En esta respuesta Android: ¿Dónde se almacenan los archivos de la base de datos? , Commonsware ha sugerido extraer el archivo de base de datos ejecutándose en modo de depuración. Pero tampoco funciona Cualquier ayuda sobre cómo depurar la base de datos sin rootear el dispositivo sería muy apreciada.

Me repetiré de otra respuesta :

A partir del API nivel 8 (Android 2.2), si crea la aplicación como depurable, puede usar el comando shell run-as para ejecutar un comando o ejecutable como un usuario / aplicación específico o simplemente cambiar al UID de su aplicación para que pueda puede acceder a su directorio de datos.

Por lo tanto, si desea extraer la base de datos de su aplicación del dispositivo, debe ejecutar la versión de depuración de la aplicación, conectarse con adb shell y ejecutar el siguiente comando:

 run-as com.yourpackage sh -c "cat ~/databases/db-file" > /sdcard/db-file.sqlite 

Esto copiará su db-file en la raíz de su tarjeta SD / almacenamiento externo. Ahora puede obtenerlo fácilmente desde allí utilizando el administrador de archivos, adb pull o cualquier otra cosa que desee. Tenga en cuenta que con este enfoque, NO es necesario que su aplicación tenga el permiso WRITE_EXTERNAL_STORAGE , ya que la copia la realiza el usuario del shell que siempre puede escribir en el almacenamiento externo.

En los sistemas Linux / Mac existe la posibilidad de copiar una base de datos directamente a su computadora con el siguiente comando que puede usar sin ingresar el shell adb:

 adb shell 'run-as com.yourpackage sh -c "cat ~/databases/db-file"' > db-file.sqlite 

Sin embargo, esto no funcionará correctamente en Windows debido a la conversión de símbolos CR / LF. Usa el método anterior allí.

Uso este script de shell en mi MAC, que copia la base de datos directamente a mi carpeta de inicio. Solución fácil de un clic, simplemente cambie el nombre del paquete (com.example.app) y el nombre de la base de datos (database.sqlite)

Script simple

 #!/bin/bash adb -d shell 'run-as com.example.app cat /data/data/com.example.app/databases/database.sqlite > /sdcard/database.sqlite' adb pull /sdcard/database.sqlite ~/ 

Script que acepta argumentos [nombre_paquete] [base de datos]

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

La mejor forma de ver y administrar tu base de datos de aplicaciones de Android es usar esta biblioteca https://github.com/sanathp/DatabaseManager_For_Android

Con esta biblioteca puede administrar la base de datos SQLite de su aplicación desde su aplicación. puede ver las tablas en la base de datos de su aplicación, actualizar, eliminar, insertar filas en sus tablas. Todo desde su aplicación.

Es un solo archivo de actividad java, solo agrega el archivo java a tu carpeta de origen. Cuando el desarrollo finalice, elimina el archivo java de tu carpeta src, eso es todo.

Me ayudó mucho. Espero que te ayude también.

Puede ver la demostración de 1 minuto aquí: http://youtu.be/P5vpaGoBlBY

En mi aplicación, exporto la base de datos a la tarjeta SD. Una vez que la base de datos está en la tarjeta SD, se puede acceder conectando el dispositivo a su computadora.

Mira esta publicación: hacer una copia de seguridad de la base de datos a la tarjeta SD en Android

Si lo consigues

 The system cannot find the path specified. 

tratar

 adb -d shell "run-as com.yourpackage cat /data/data/com.yourpackage/databases/dbname.sqlite > /sdcard/dbname.sqlite" 

Tenga en cuenta la doble cita!

Simplemente lo hice:

 $ adb shell shell@android:/ $ run-as myapp.package.name sh shell@android:/data/data/myapp.package.name $ 

Entonces puedo depurar una base de datos sqlite o lo que sea que quiera hacer desde el shell con los permisos correctos.

Hay una forma de depurar un apk para usar un progtwig llamado run-as desde el shell adb (no raíz) para copiar el archivo privado de una aplicación.

Aquí hay instrucciones paso a paso, principalmente tomadas de una combinación de las otras respuestas. Esto funciona con dispositivos que no están desbloqueados.

  1. Conecte su dispositivo e inicie la aplicación en modo de depuración.

  2. Copie el archivo de la base de datos de su carpeta de aplicaciones a su tarjeta sd: ejecute:

    ./adb -d shell ‘run-as com.yourpackge.name cat /data/data/com.yourpackge.name/databases/filename.sqlite> /sdcard/filename.sqlite’

  3. Tire de los archivos de la base de datos a su máquina: ejecute:

    ./adb pull / sdcard / execute: ./adb

  4. Instalar Firefox SQLLite Manager: https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/

  5. Abra Firefox SQLLite Manager y abra su archivo de base de datos desde el paso 3 anterior.

  6. ¡Disfrutar!

Aunque es una vieja pregunta, creo que sigue siendo relevante y merece una respuesta de estado actual. Hay herramientas disponibles que le permiten inspeccionar las bases de datos directamente (sin la necesidad de extraerlas del dispositivo o emulador).

La herramienta que descubrí recientemente (y que más me gusta ) es la base de datos de depuración de Android .

Solo necesita agregar esta dependencia:

 debugImplementation 'com.amitshekhar.android:debug-db:1.0.3' 

No se requiere más código. Después de iniciar su aplicación, abra logcat y filtre para “DebugDB” y encontrará un mensaje que dice:

 D/DebugDB: Open http://192.168.178.XXX:8080 in your browser 

Funciona con todos los navegadores y puede inspeccionar las tablas de la base de datos y las preferencias compartidas.

enter image description here

También funciona con el predeterminado y los emuladores Genymotion.


La herramienta que utilicé antes es Stetho .

Desventaja: necesitas agregar un poco de código y estás vinculado al navegador Chrome.

Ventaja: Usted tiene la opción de también inspeccionar el tráfico de la red.

Debe ejecutar adb como root o usarlo en un teléfono rooteado.

Para ejecutar adb como root, use la adb root

Ver también: ¿Por qué se me niega el acceso a la carpeta de datos cuando uso adb?

Ninguna de las soluciones run-as and-cat-to-sdcard funcionó para mí en Android 4.4.2. No estoy seguro, pero sospecho que puede deberse a que la herramienta run-as no maneja correctamente los nuevos sdcard_r y sdcard_rw .

Primero tuve que copiar el archivo de base de datos en /files en el almacenamiento interno privado de mi aplicación:

 shell@hammerhead:/ $ run-as com.example.myapp shell@hammerhead:/data/data/com.example.myapp $ cp databases/mydb files/mydb 

Luego copié en /sdcard/Android/data/com.example.myapp/files en Javaland (esto requiere el permiso WRITE_EXTERNAL_STORAGE ):

 public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { ... if (isExternalStorageWritable()) { final FileInputStream input; try { input = openFileInput("mydb"); File output = new File(getExternalFilesDir(null), "mydb"); copy(input, output); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } public void copy(FileInputStream in, File dst) throws IOException { OutputStream out = new FileOutputStream(dst); // Transfer bytes from in to out byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); } public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); return Environment.MEDIA_MOUNTED.equals(state); } } 

Finalmente, copié el archivo a mi computadora portátil:

 $ adb pull /sdcard/Android/data/com.example.myapp/files/mydb 

Mi dispositivo no tenía sdcard

entonces la primera solución no funcionó para mí.

Si tiene problemas similares, intente así:

  adb shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite"; adb pull /data/data/package/databases/yourdb.sqlite 

Pruebe esta aplicación: SQLiteWeb ( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb ). Proporciona acceso remoto a su base de datos sin extraerlo.

En la versión de pago, tiene acceso de root para la base de datos privada (/ data / data / package-name …) o implementa un proveedor de contenido para conectarse usando SQLiteWeb (Instrucciones dentro de la aplicación)

Pero si quiere quedarse con la versión gratuita, puede crear su base de datos en el almacenamiento externo:

 database = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory() + "/" + DATABASE_NAME, null, DATABASE_VERSION); 

En OSX, usando @Tadas answer con automator y sqllitebrowser ( https://github.com/sqlitebrowser/sqlitebrowser ):

  1. abra Automator y cree un nuevo flujo de trabajo.

  2. agregue la acción “Ejecutar script de shell”.

  3. Pega esto:

    source ~ / .bash_profile adb shell ‘run-as cat /data/data/your_app_uid/databases/db.name> /tmp/db.name’ adb pull /tmp/db.name ~ / open -a sqlitebrowser ~ / db. nombre

  4. haga clic en ejecutar para actualizar la base de datos en sqlitebrowser.

  1. Abre una terminal
  2. cd (para mí en Windows cd C:\Users\Willi\AppData\Local\Android\sdk )
  3. cd platform-tools
  4. adb shell (esto funciona solo si solo se está ejecutando un emulador)
  5. cd data/data
  6. su (ganar privilegios de superusuario)
  7. cd /databases
  8. sqlite3
  9. emitir sentencias de SQL ( importante: rescindirlas con ; contrario, la sentencia no se emite y se divide en una nueva línea en su lugar).

Nota: Use ls (Linux) o dir (Windows) si necesita enumerar los contenidos del directorio.