2010-11-17 3 views
6

J'essaye ceci avec mon Nexus One. J'ai le SDK Android et ont utilisé la commande adb pull /data/data/com.myapp.android/databases C: \ tire mais tout ce que je reçois est pull: construction de la liste des fichiers ... 0 fichiers tirés. 0 fichiers ignorés. En outre, il semble que peu importe la quantité de données que j'ajoute à l'application Didacticiel NotePad que j'ai installée, la taille des données pour l'application (comme indiqué dans Paramètres) ne dépasse jamais 8 Ko. Comment est-ce possible? Y a-t-il un autre endroit où les bases de données sont stockées? Lorsque j'utilise la vue Explorateur de fichiers (qui fait partie d'ADT) dans Eclipse, je vois qu'il n'y a rien dans/data. Pour ajouter une touche, je n'ai aucune difficulté à extraire d'autres fichiers de l'appareil. C'est juste des bases de données avec lesquelles j'ai des problèmes. Ai-je raté quelque chose? Merci beaucoup.Comment puis-je retirer des bases de données de mon android sur mon bureau?

Répondre

10

L'accès au stockage interne est impossible à moins que votre téléphone ne soit rooté. Un moyen simple est d'utiliser l'émulateur, et vous pouvez ensuite accéder aux fichiers. Pour obtenir une base de données de l'appareil que j'ai écrit un petit utilitaire et mis dans une interface utilisateur de débogage pour elle:

private void backupDb() throws IOException { 
    File sd = Environment.getExternalStorageDirectory(); 
    File data = Environment.getDataDirectory(); 

    if (sd.canWrite()) { 

     String currentDBPath = "/data/com.yourcompany.yourapp/databases/yourapp.db"; 
     String backupDBPath = "/yourapp_logs/yourapp.db"; 

     File currentDB = new File(data, currentDBPath); 
     File backupDB = new File(sd, backupDBPath); 

     if (backupDB.exists()) 
      backupDB.delete(); 

     if (currentDB.exists()) { 
      makeLogsFolder(); 

      copy(currentDB, backupDB); 
     } 

     dbFilePath = backupDB.getAbsolutePath(); 
    } 
} 

private void makeLogsFolder() { 
    try { 
     File sdFolder = new File(Environment.getExternalStorageDirectory(), "/yourapp_logs/"); 
     sdFolder.mkdirs(); 
    } 
    catch (Exception e) {} 
    } 

private void copy(File from, File to) throws FileNotFoundException, IOException { 
    FileChannel src = null; 
    FileChannel dst = null; 
    try { 
     src = new FileInputStream(from).getChannel(); 
     dst = new FileOutputStream(to).getChannel(); 
     dst.transferFrom(src, 0, src.size()); 
    } 
    finally { 
     if (src != null) 
      src.close(); 
     if (dst != null) 
      dst.close(); 
    } 
} 
+0

Merci d'avoir partagé votre code. Au début, j'ai utilisé l'émulateur, mais je suis passé au développement sur mon téléphone Nexus One Dev parce que c'est beaucoup plus rapide de cette façon. Ce qui est bizarre, c'est que mon Nexus One est enraciné. Quand je démarre, je vois le cadenas déverrouillé en bas de l'écran pendant le chargement d'Android. Cela ne signifie-t-il pas que je devrais être capable d'exécuter des commandes root? –

+2

Vous codez bien, mais mon Eclipse ne reconnaît pas la copie (currentDB, backupDB); instruction. Avez-vous installé une bibliothèque supplémentaire (.jar) pour utiliser la méthode de copie? – Rutger

+0

Hey dhaag23, pourriez-vous s'il vous plaît fournir la mise en œuvre de la méthode de copie? –

0

Créer un fichier « pull.bat » dans votre bureau Windows.

Dans le fichier put:

db pull /data/com.APPNAME/databases/DBNAME.sqlite 
pause 
0

Si vous utilisez MAC ou Linux essayez ce script. Cela ne nécessite pas les permissions root

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