web-dev-qa-db-fra.com

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

Je travaille actuellement sur une application WiFi pour Android. Je ne parviens pas à accéder à la base de données sur le périphérique. Le débogage dans l'émulateur ne fonctionne pas pour moi, car l'émulateur ne prend pas en charge le WiFi. J'ai essayé d'extraire le fichier de base de données de l'appareil en utilisant 

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

Mais j'obtiens l'erreur "Autorisation refusée". Dans cette réponse Android: Où sont stockés les fichiers de base de données? , Commonsware a suggéré d'extraire le fichier de base de données en s'exécutant en mode débogage. Mais ça ne marche pas aussi. Toute aide sur la façon de déboguer la base de données sans enregistrer le périphérique serait grandement appréciée.

90
Primal Pappachan

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

À partir de l’API 8 (Android 2.2), si vous construisez l’application en tant que debuggable, vous pouvez utiliser la commande Shell run-as pour exécuter une commande ou un exécutable en tant qu’utilisateur/application spécifique ou simplement basculer sur la UID de votre application pour pouvoir y accéder. son répertoire de données.

Donc, si vous souhaitez extraire votre base de données d'application du périphérique, vous devez exécuter la version de débogage de l'application, vous connecter avec adb Shell et exécuter la commande suivante:

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

Cela va copier votre db-file à la racine de votre carte SD/stockage externe. Maintenant, vous pouvez facilement l'obtenir à l'aide du gestionnaire de fichiers, de adb pull ou de ce que vous préférez. Notez qu'avec cette approche, votre application n'a PAS besoin d'avoir l'autorisation WRITE_EXTERNAL_STORAGE, car la copie est effectuée par l'utilisateur Shell, qui peut toujours écrire sur le stockage externe.

Sur les systèmes Linux/Mac, il est possible de copier une base de données directement sur votre ordinateur avec la commande suivante, que vous pouvez 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 ici.

138
Idolon

J'utilise ce script shell sur mon MAC, qui copie la base de données directement dans mon dossier personnel. Solution simple en un clic, il suffit de changer le nom du package (com.example.app) et le nom de la base de données (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 acceptant les arguments [nom_package] [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
23
Tadas Valaitis

Le meilleur moyen 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 votre base de données d'applications SQLite à partir de votre application elle-même . Vous pouvez afficher les tables de votre base de données d'applications, mettre à jour, supprimer, insérer des lignes dans vos tables .Tout depuis votre application.

C’est un fichier d’activité Java unique, il suffit d’ajouter le fichier Java à votre dossier source. Une fois le développement terminé, supprimez le fichier Java de votre dossier src.

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

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

14
sanath_p

Si vous obtenez

The system cannot find the path specified.

essayer

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

Notez la double citation!

5
Gerold Meisinger

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 connectant le périphérique à votre ordinateur.

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

Bien que, c’est une vieille question, je pense qu’elle est toujours pertinente et mérite une réponse actuelle. Il existe des outils permettant d’inspecter directement les bases de données (sans qu’il soit nécessaire de les extraire du périphérique ou de l’émulateur).

L'outil que j'ai découvert le plus récemment (et que je préfère surtout) est Android Debug Database .

Il vous suffit d'ajouter cette dépendance:

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

Aucun autre code n'est requis . Après avoir lancé votre application, ouvrez logcat et filtrez pour "DebugDB" et vous trouverez un message disant 

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

Cela fonctionne avec tous les navigateurs et vous pouvez inspecter vos tables de base de données et vos préférences partagées.

 enter image description here

Cela fonctionne également avec les émulateurs par défaut et Genymotion.


L'outil que j'ai utilisé auparavant est stetho .

Inconvénient: vous devez ajouter un peu de code et vous êtes lié au navigateur Chrome.

Avantage: vous avez également la possibilité d'inspecter le trafic réseau.

5
Peter F

J'ai simplement fait:

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

Ensuite, je peux déboguer une base de données sqlite ou tout ce que je veux faire avec Shell avec les autorisations appropriées.

3
smichak

Il est possible, si un apk est débogable, d’utiliser un programme appelé run-as à partir du shell (non root) adb pour copier le fichier privé d’une application. 

2
Chris Stratton

Voici des instructions étape par étape, principalement issues d'une combinaison des autres réponses. Cela fonctionne avec des appareils qui ne sont pas déverrouillés.

  1. Connectez votre appareil et lancez l'application en mode débogage.

  2. Copiez le fichier de base de données de votre dossier d’application sur votre carte SD: exécutez:

    ./adb -d Shell 'run-as com.votrepackge.name cat /data/data/com.votrepackge.name/databases/filename.sqlite> /sdcard/filename.sqlite'

  3. Tirez les fichiers de base de données sur votre machine: exécutez:

    ./adb tirer/sdcard/execute: ./adb

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

  5. Ouvrez Firefox SQLLite Manager et ouvrez votre fichier de base de données à partir de l'étape 3 ci-dessus.

  6. Prendre plaisir!

2
Andy Cochrane

Vous devez exécuter adb en tant que root ou l’utiliser sur un téléphone rooté.

Pour exécuter adb en tant que root, utilisez adb root

Voir aussi: Pourquoi l'accès au dossier de données est-il refusé lors de l'utilisation d'adb?

1
Malfist

Aucune des solutions run-as- et-cat-to-sdcard ne fonctionnait pour moi sous Android 4.4.2. Je ne suis pas sûr, mais je suppose que cela peut être dû à l'outil run-as qui ne gère pas correctement les nouvelles autorisations sdcard_r et sdcard_rw.

J'ai d'abord dû copier le fichier de base de données dans /files dans la mémoire de stockage interne privée de mon application: 

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

Ensuite, j'ai copié /sdcard/Android/data/com.example.myapp/files dans Javaland (cela nécessite l'autorisation 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);
     }
 }

Enfin, j'ai copié le fichier sur mon ordinateur portable:

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

Mon appareil n'avait pas de carte SD 

donc la première solution n'a pas fonctionné pour moi. 

Si vous rencontrez un problème similaire, essayez comme ceci: 

  adb Shell "run-as package chmod 777 /data/data/package/databases/yourdb.sqlite";
  adb pull /data/data/package/databases/yourdb.sqlite
1
dsharew
  1. Ouvrir un terminal
  2. cd <Android_SDK_PATH> (pour moi sous Windows cd C:\Users\Willi\AppData\Local\Android\sdk)
  3. cd platform-tools
  4. adb Shell (cela ne fonctionne que si un seul émulateur est en cours d'exécution)
  5. cd data/data
  6. su (obtenir les privilèges de super utilisateur)
  7. cd <PACKAGE_NAME>/databases
  8. sqlite3 <DB_NAME>
  9. émet des instructions SQL ( important: les termine par ;, sinon l'instruction n'est pas émise et passe à une nouvelle ligne)

Remarque: Utilisez ls (Linux) ou dir (Windows) si vous devez répertorier le contenu du répertoire.

0
Willi Mentzel

Essayez cette application: SQLiteWeb ( https://play.google.com/store/apps/details?id=br.com.cm.sqliteweb ). Il fournit un accès à distance à votre base de données sans la retirer.

En version payante, il dispose d'un accès racine pour une base de données privée (/ data/data/nom-package ...) ou implémente un fournisseur de contenu pour se connecter à l'aide de SQLiteWeb (Instructions dans l'application)

Mais si vous voulez rester avec la version gratuite, vous pouvez créer votre base de données dans un stockage externe:

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

Sous OSX, en utilisant @Tadas, répondez avec automator et sqllitebrowser ( https://github.com/sqlitebrowser/sqlitebrowser ):

  1. ouvrez Automator et créez un nouveau flux de travail.

  2. ajoutez l'action "Run Shell Script".

  3. Coller ceci:

    source ~/.bash_profile adb Shell 'run-as cat /data/data/votre_app_uid/databases/db.name> /tmp/db.name'adb tirer /tmp/db.name ~ /open -a sqlitebrowser ~/db.name

  4. cliquez sur Exécuter pour actualiser la base de données sur sqlitebrowser.

0
Zaster