android - tabla - Depuración de la base de datos sqlite en el dispositivo
exportar base de datos sqlite android (14)
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.
Conecte su dispositivo e inicie la aplicación en modo de depuración.
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''
Tire de los archivos de la base de datos a su máquina: ejecute:
./adb pull / sdcard / execute: ./adb
Instalar Firefox SQLLite Manager: https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/
Abra Firefox SQLLite Manager y abra su archivo de base de datos desde el paso 3 anterior.
¡Disfrutar!
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.
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.
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?
En OSX, usando @Tadas answer con automator y sqllitebrowser ( https://github.com/sqlitebrowser/sqlitebrowser ):
abra Automator y cree un nuevo flujo de trabajo.
agregue la acción "Ejecutar script de shell".
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
haga clic en ejecutar para actualizar la base de datos en sqlitebrowser.
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
Hay una forma de depurar un apk para usar un programa llamado run-as desde el shell adb (no raíz) para copiar el archivo privado de una aplicación.
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
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 alUID
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í.
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
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);
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.
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
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