94 votes

Débogage de la base de données sqlite sur le périphérique

Je travaille actuellement sur une application WiFi pour Android. J'ai des difficultés à accéder à la base de données sur l'appareil. Le débogage dans l'émulateur ne fonctionne pas pour moi, car il n'y a pas de support WiFi dans l'émulateur. J'ai essayé d'extraire le fichier de la base de données de l'appareil en utilisant la méthode suivante

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

Mais je reçois l'erreur "Permission refusée.". Dans cette réponse Android : Où sont stockés les fichiers de la base de données ? Commonsware a suggéré d'extraire le fichier de la base de données en l'exécutant en mode débogage. Mais cela ne fonctionne pas non plus. Toute aide sur la façon de déboguer la base de données sans enraciner l'appareil serait très appréciée.

140voto

Idolon Points 11503

Je vais me répéter depuis une autre réponse :

À partir du niveau 8 de l'API (Android 2.2), si vous construisez l'application comme débuggeable, vous pouvez utiliser le shell run-as pour exécuter une commande ou un exécutable en tant qu'utilisateur/application spécifique ou simplement passer à la commande UID de votre application afin de pouvoir accéder à son répertoire de données.

Ainsi, si vous souhaitez extraire la base de données de votre application du périphérique, vous devez exécuter la version de débogage de l'application, vous connecter à l'aide de la commande adb shell et exécutez la commande suivante :

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

Cela copiera votre db-file à la racine de votre carte SD / stockage externe. Maintenant, vous pouvez facilement l'obtenir à partir de là en utilisant le gestionnaire de fichiers, adb pull ou tout ce que vous voulez. Notez qu'avec cette approche, il n'est PAS nécessaire que votre application dispose de WRITE_EXTERNAL_STORAGE car la copie est effectuée par l'utilisateur du shell qui peut toujours écrire sur le stockage externe.

Sur les systèmes Linux/Mac il y a une possibilité de copier une base de données directement sur votre ordinateur avec la commande suivante que l'on peut utiliser sans entrer dans le shell adb :

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

Toutefois, cela ne fonctionnera pas correctement sous Windows en raison de la conversion des symboles CR/LF. Utilisez l'ancienne méthode dans ce cas.

23voto

Tadas Valaitis Points 310

J'utilise ce shell script sur mon MAC, qui copie la base de données directement dans mon dossier personnel. Solution facile en un clic, il suffit de changer le nom du paquet (com.example.app) et le nom de la base de données (database.sqlite).

Simple script

#!/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 qui accepte les arguments [nom_du_paquet] [base de données].

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

14voto

user3716835 Points 120

La meilleure façon de visualiser et de gérer votre base de données d'applications Android est d'utiliser cette bibliothèque. https://github.com/sanathp/DatabaseManager_For_Android

Avec cette bibliothèque, vous pouvez gérer la base de données SQLite de votre application depuis l'application elle-même. Vous pouvez voir les tables de votre base de données, mettre à jour, supprimer, insérer des lignes dans vos tables, le tout depuis votre application.

Il s'agit d'un seul fichier d'activité java, il suffit d'ajouter le fichier java à votre dossier source, puis de supprimer le fichier java de votre dossier src lorsque le développement est terminé.

Cela m'a beaucoup aidé. J'espère que cela vous aidera aussi.

Vous pouvez voir la démo d'une minute ici : http://youtu.be/P5vpaGoBlBY

5voto

Dans mon application, j'exporte la base de données sur la carte SD. Une fois que la base de données est sur la carte SD, vous pouvez y accéder en branchant l'appareil à votre ordinateur.

Regardez ce post : Faire une sauvegarde de la base de données sur SDCard sur Android

5voto

lambdor Points 3341

Si vous obtenez

The system cannot find the path specified.

essayez

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

Notez les guillemets !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X