web-dev-qa-db-fra.com

Comment vérifier la base de données sur un appareil Android non root

Je développe une application où j'utilise la base de données sqllite3 pour stocker des valeurs. J'ai Nexus S et Nexus 7 sont des appareils non racinés. Comment puis-je obtenir la base de données pour mon application à des fins de débogage.

J'ai essayé (1) J'ai essayé toutes les approches mentionnées ici

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

Cela dit cp non trouvé ..

(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 
18
CodingRat

Vous pouvez écrire votre base de données sur la mémoire externe avec les éléments suivants:

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();
        }
    }
}

DB_NAME est le nom de ma base de données et DB_PATH est défini comme suit:

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/";
    }

Et ajoutez la permission suivante (Merci à @Sathesh pour l'avoir signalé):

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

J'appelle cette méthode chaque fois que j'écris une base de données afin que mon fichier de base de données le plus récent se trouve dans la mémoire externe et que je puisse le visualiser et le déboguer à partir de là. 

Ensuite, vous pouvez utiliser l’application X-Plore pour afficher la base de données à partir de la mémoire externe directement sur le périphérique Android. 

30
TronicZomB

La solution suivante ne fonctionne que pour les applications déboguables. Cela peut ne pas fonctionner correctement sur tous les périphériques, car la commande d'exécution en tant que ne fonctionne pas sur certains périphériques, en particulier avec Jelly Bean. 

  1. Créez un fichier * .bat et copiez les scripts suivants

    shell adb run-as [package] chmod 777/data/data/[package]/database/

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

    shell adb run-as [paquet] cp/data/data/[paquet]/bases de données/[nom_fichier_bd]/sdcard/

    adb pull/sdcard/[nom_fichier_bd]

  2. Remplacez [package] par le package d'application souhaité

  3. Remplacez [nom_fichier_bd] par le nom de base souhaité. Exécutez le fichier bat etvous devriez voir la base de données copiée dans le même dossier que le fichier bat

La solution ci-dessus suppose:

  • Vous travaillez sur Windows 
  • L'appareil est connecté et visible sous "Adb devices"
36
kmalmur

Voici une réponse beaucoup plus simple et directe: (Testé sur Android: sans racines )

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

maintenant, tirez votre base de données sur le chemin d'accès par défaut adb

adb -d pull /sdcard/mydatabase.db

ou, sur votre bureau, par exemple.

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

vous voudrez peut-être supprimer la copie avec une commande ci-dessous:

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

L'option -d choisit le périphérique par défaut si plusieurs émulateurs sont présents. 

9
kolunar

Si vous ne connaissez pas votre chemin d'accès, vous pouvez utiliser ceci:

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();
        }
    }
}

Ou si vous avez besoin de copier la base de données dans le dossier "Download" public, vous pouvez utiliser ceci:

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();
    }
}

Cela fonctionne parfaitement sur mon appareil Nexus 4.

9
mr.boyfox

Je devais juste faire quelque chose comme ça et il y a un moyen de le faire, même si c'est pénible. Vous devez classer le fichier en tant que compte d'utilisateur de l'application, puis le rediriger vers un emplacement accessible en écriture. Cela a fonctionné pour moi sur mon Nexus 4 sous 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
3
Ted Mielczarek

Essayez d’utiliser stetho Library développée par Facebook, elle vous permet de visualiser la base de données via le navigateur Web https://facebook.github.io/stetho/

2
rAm

Si après avoir couru 

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

vous recevez "run-as: Package 'votre.package.name" est inconnu ", puis essayez d'obtenir une base de données à partir de l'émulateur. Voir ici: https://stackoverflow.com/a/44089632/2914140

Dans Android Studio 3.0, cliquez sur Affichage> Fenêtres d'outils> Explorateur de fichiers de périphérique . Développez les nœuds/data/data/[nom du paquet].

0
CoolMind

Je pense que c'est le moyen le plus simple. Ajoutez cette dépendance à votre fichier de classement: debugImplementation 'com.amitshekhar.Android:debug-db:1.0.0'

Après cela, lorsque vous lancerez votre application dans votre console, vous pourrez voir le message: D/DebugDB: Open http://192.168.1.114:8080 dans votre navigateur

Et il y a votre base de données.

0
f.trajkovski
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/

Dans Xamarin.forms je devais remplacer des bases de données en fichiers

0
Massimo Alvaro