Sto provando questo con il mio Nexus One. Ho l'SDK Android e ho usato il comando adb pull /data/data/com.myapp.android/databases C: \ pulls ma tutto quello che ottengo è pull: costruzione lista file ... 0 file tirati. 0 file saltati. Inoltre, sembra non importa quanti dati aggiungo all'app tutorial NotePad che ho installato, la dimensione dei dati per l'app (come mostrato in Impostazioni) non supera mai gli 8 KB. Com'è possibile? C'è un altro posto dove sono archiviati i database? Quando utilizzo la vista Esplora file (che fa parte di ADT) in Eclipse, vedo che non c'è niente in/data. Per aggiungere un tocco, non ho problemi a tirare altri file dal dispositivo. Sono solo database con cui ho problemi. Mi manca qualcosa? Grazie mille.Come posso estrarre database dal mio android sul mio desktop?
6
A
risposta
10
L'accesso alla memoria interna non è possibile a meno che il telefono non sia rootato. Un modo semplice è utilizzare l'emulatore e quindi è possibile ottenere i file. Per ottenere un database spegnere il dispositivo che ho scritto una piccola utility e mettere in alcuni di debug interfaccia utente per esso:
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
Creare un file "pull.bat" nel desktop di Windows.
Nel file put:
db pull /data/com.APPNAME/databases/DBNAME.sqlite
pause
0
Se si utilizza Mac o Linux provare questo script. Questo non richiede i permessi di 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
Grazie per aver condiviso il tuo codice. Inizialmente ho usato l'emulatore ma sono passato allo sviluppo sul mio telefono Nexus One Dev perché è molto più veloce in quel modo. La cosa strana è che il mio Nexus One è radicato. Quando avvio, vedo il lucchetto sbloccato nella parte inferiore dello schermo mentre carica Android. Questo non significa che dovrei essere in grado di eseguire i comandi di root? –
Il codice sembra buono, ma Eclipse non riconosce la copia (currentDB, backupDB); istruzioni. Avete qualche libreria aggiuntiva (.jar) installata per usare il metodo di copia? – Rutger
Hey dhaag23, potresti fornire l'implementazione del metodo di copia? –