Cómo verificar la base de datos en un dispositivo Android no rooteado

Estoy desarrollando una aplicación en la que estoy usando la base de datos sqllite3 para almacenar valores. Tengo Nexus S y Nexus 7, ambos son dispositivos sin raíz. ¿Cómo puedo obtener la base de datos para mi aplicación con fines de depuración?

He intentado (1) He intentado todos los enfoques mencionados aquí

adb shell run-as app.package.name \ cp /data/data/package.name/databases/application.sqlite /sdcard/ exit adb pull /sdcard/application.sqlite ~/ 

Esto dice que cp no encontrado …

(2) http://developer.android.com/tools/help/adb.html#sqlite

 adb -s emulator-5554 shell # sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db SQLite version 3.3.12 Enter ".help" for instructions .... enter commands, then quit... sqlite> .exit 

Puede escribir su base de datos en la memoria externa con lo siguiente:

 private void writeToSD() throws IOException { File sd = Environment.getExternalStorageDirectory(); if (sd.canWrite()) { String currentDBPath = DB_NAME; String backupDBPath = "backupname.db"; File currentDB = new File(DB_PATH, currentDBPath); File backupDB = new File(sd, backupDBPath); if (currentDB.exists()) { FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); } } } 

Donde DB_NAME es el nombre de mi base de datos y DB_PATH se define de la siguiente manera:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { DB_PATH = context.getFilesDir().getAbsolutePath().replace("files", "databases") + File.separator; } else { DB_PATH = context.getFilesDir().getPath() + context.getPackageName() + "/databases/"; } 

Y agregue el siguiente permiso (Gracias a @Sathesh por señalar esto):

  

Llamo a este método cada vez que tengo una base de datos para que mi archivo de base de datos más reciente esté en la memoria externa y puedo verlo y depurar desde allí.

Luego puede usar la aplicación X-Plore para ver la base de datos desde la memoria externa directamente en el dispositivo Android.

La siguiente solución funciona solo para aplicaciones que son depurables. Puede que no funcione bien en todos los dispositivos, ya que el comando run-as no funciona en algunos dispositivos, especialmente con Jelly Bean.

  1. Cree un archivo * .bat y copie los siguientes scripts

    adb shell run-as [paquete] chmod 777 / data / data / [paquete] / databases /

    adb shell run-as [paquete] chmod 777 / data / data / [paquete] / databases / [db_file_name]

    adb shell run-as [paquete] cp / data / data / [paquete] / databases / [db_file_name] / sdcard /

    adb pull / sdcard / [db_file_name]

  2. Cambie [paquete] al paquete de aplicación deseado

  3. Cambia [db_file_name] al nombre de db deseado. Ejecuta el archivo bat y deberías ver la base de datos copiada en la misma carpeta que el archivo bat.

La solución anterior asume:

  • Estás trabajando en Windows
  • El dispositivo está conectado y visible en “dispositivos adb”

Si no conoce su ruta de aplicación, puede usar esto:

 public void copyAppDbToExternalStorage() throws IOException { File sd = Environment.getExternalStorageDirectory(); File currentDB = getApplicationContext().getDatabasePath("databaseName"); //databaseName=your current application database name, for example "my_data.db" if (sd.canWrite()) { File backupDB = new File(sd, "toDatabaseName"); // for example "my_data_backup.db" if (currentDB.exists()) { FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); } } } 

O si necesita copiar la base de datos a la carpeta pública “Descargar”, puede usar esto:

 public void copyAppDbToDownloadFolder() throws IOException { File backupDB = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "toDatabaseName"); // for example "my_data_backup.db" File currentDB = getApplicationContext().getDatabasePath("databaseName"); //databaseName=your current application database name, for example "my_data.db" if (currentDB.exists()) { FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); } } 

Esto funciona perfectamente en mi dispositivo Nexus 4.

Aquí hay una respuesta muy simple y directa: (Probado en Android uno: sin rootear )

 adb -d shell $ run-as my.package.name $ cp databases/mydatabase.db /sdcard/mydatabase.db $ exit $ exit 

Ahora tire de su base de datos a la ruta predeterminada de adb

 adb -d pull /sdcard/mydatabase.db 

o, a su escritorio por ejemplo

 adb -d pull /sdcard/mydatabase.db C:\Users\user\Desktop 

Es posible que desee eliminar la copia con un comando a continuación:

 adb -d shell "rm /sdcard/mydatabase.db" 

-d opción elige el dispositivo predeterminado si tiene más de un emulador.

Simplemente tuve que hacer algo como esto y hay una manera de hacerlo, aunque es un dolor. Debe catalogar el archivo como la cuenta de usuario de la aplicación y, a continuación, canalizarlo a una ubicación de escritura. Esto funcionó para mí en mi Nexus 4 corriendo 4.3.3:

 adb shell "run-as org.your.application cat /data/data/org.your.application/your-file > /mnt/sdcard/your-file" adb pull /mnt/sdcard/your-file 

Trate de usar la biblioteca Stetho desarrollada por Facebook, le permite ver la base de datos a través del navegador web https://facebook.github.io/stetho/

 adb shell "run-as CHR.Droid chmod 666 /data/data/CHR.Droid/files/CHR.db" adb shell cp /data/data/CHR.Droid/files/CHR.db /sdcard/ 

En Xamrin.forms tuve que reemplazar las bases de datos por archivos

Si después de ejecutar

 adb shell "run-as your.package.name" 

recibe “run-as: Package ‘your.package.name’ es desconocido”, luego intente obtener una base de datos del emulador. Vea aquí: https://stackoverflow.com/a/44089632/2914140

En Android Studio 3.0, haga clic en Ver> Herramientas de Windows> Explorador de archivos de dispositivo. Expandir / datos / datos / [nombre del paquete] nodos.

No puede acceder / carpeta de datos en un dispositivo no rooteado

No hay manera de hacer eso. Android tiene grandes mecanismos de seguridad. Solo su aplicación puede acceder a sus propios archivos.

No es posible desde un teléfono no rooteado. No puede acceder al directorio / data, por lo que no puede copiar la base de datos o usar la aplicación sqlite como en (2). Si necesita depurar, use el simulador o las consultas de ejecución de la aplicación para inspeccionar la base de datos.