Android Emulator Yerine Cihaz Kullanılırken Oluşan Veritabanını Bilgisayara Kopyalamak
29-03-2014
Android cihazınızı emulator olarak kullanırken bazı problemler ortaya çıkmaktadır. Bunlardan bir tanesi veritabanı işlemlerinin yapıldığı uygulamalarda karşımıza çıkmaktadır. Veritabanı işlemleri yaparken genelde veritabanının içeriğini görmeye ihtiyaç duyarız. Bunun için ise veritabanı dosyasını bilgisayarımıza indirmek gereklidir. Eğer sizin android cihazınız rooted değilse private olan veritabanı dosyasını file manager'dan göremezsiniz. Bunun sonucunda ise bilgisayarınıza bu veritabanı dosyasını gönderemezsiniz.
Bu problemin çözümü için Android SDK içerisindeki platform-tools klasöründe bulunan adb.exe uygulamasına ihtiyacınız vardır. Cihazınız rooted olmadığı halde gizli veritabanını bilgisayarınıza kopyalamak için bazı komutların çalıştırılması gerekmektedir. platform-tools klasöründe shift tuşu ile birlikte sağ tıklarsanız Open Command Window Here (Komut Penceresini Burada Aç) seçeneği gelir. Bu seçeneğe tıklarsanız bulunduğunuz dizinde konsol ekranı açılır. Bu ekranda şu adımları sırasıyla yapınız:
Bu komutları sırasıyla uyguladığınızda sdcard icerisine veritabanı kopyalanmış olur. Bu işlemden sonra Ctrl+C tuşuna basarak önceki uygulamayı kapatınız. Daha sonra aşağıdaki komutu çalıştırınız:
Tüm bu işlemlerden sonra artık Desktop'ta veritabanıAdı.sqlite dosyası kaydedilmiş olur.
Örnek bir uygulamada veritabanı adı ve paket adı şu şekilde olsun:
Veritabanı Adı: users
Paket Adı: mucayufa.android.database.simple
O zaman çalıştırılması gereken komutlar şu şekilde olacaktır:
Ctrl+C'ye basıldıktan sonra
komutu çalıştırılırsa, Masaüstünde users.sqlite isimli bir dosya oluşmuş olur.
Not: Eğer yukarıdaki işlemlerde package unknown hatası alırsanız, iki farklı yöntemle veritabanını kopyalayabilirsiniz:
Yöntem 1: Cihazınız rooted ise aşağıdaki komutları sırasıyla çalıştırınız:
1. platform-tools klasöründe komut penceresi açılır
2. Aşağıdaki komutlar sırasıyla çalıştırılır
Ctrl+C'ye basıldıktan sonra
Not: Bu komutları bir batch dosyası (.bat ile biten dosya) oluşturup, bu dosyaya kopyaladıktan sonra platform-tools klasörü içerisinde çalıştırabilirsiniz:
Yöntem 2: Kodlar ile veritabanını import veya export edebiliriz:
Bu problemin çözümü için Android SDK içerisindeki platform-tools klasöründe bulunan adb.exe uygulamasına ihtiyacınız vardır. Cihazınız rooted olmadığı halde gizli veritabanını bilgisayarınıza kopyalamak için bazı komutların çalıştırılması gerekmektedir. platform-tools klasöründe shift tuşu ile birlikte sağ tıklarsanız Open Command Window Here (Komut Penceresini Burada Aç) seçeneği gelir. Bu seçeneğe tıklarsanız bulunduğunuz dizinde konsol ekranı açılır. Bu ekranda şu adımları sırasıyla yapınız:
adb shell run-as paketAdı cat /data/data/paketAdı/databases/veritabanıAdı > /sdcard/veritabanıAdı.sqlite
Bu komutları sırasıyla uyguladığınızda sdcard icerisine veritabanı kopyalanmış olur. Bu işlemden sonra Ctrl+C tuşuna basarak önceki uygulamayı kapatınız. Daha sonra aşağıdaki komutu çalıştırınız:
adb pull /sdcard/veritabanıAdı.sqlite C:\Users\{UserName}\Desktop\veritabanıAdı.sqlite
Tüm bu işlemlerden sonra artık Desktop'ta veritabanıAdı.sqlite dosyası kaydedilmiş olur.
Örnek bir uygulamada veritabanı adı ve paket adı şu şekilde olsun:
Veritabanı Adı: users
Paket Adı: mucayufa.android.database.simple
O zaman çalıştırılması gereken komutlar şu şekilde olacaktır:
adb shell run-as mucayufa.android.database.simple cat /data/data/mucayufa.android.database.simple/databases/users >/sdcard/users.sqlite
Ctrl+C'ye basıldıktan sonra
adb pull /sdcard/users.sqlite C:\Users\{Kullanici}\Desktop\users.sqlite
komutu çalıştırılırsa, Masaüstünde users.sqlite isimli bir dosya oluşmuş olur.
Not: Eğer yukarıdaki işlemlerde package unknown hatası alırsanız, iki farklı yöntemle veritabanını kopyalayabilirsiniz:
Yöntem 1: Cihazınız rooted ise aşağıdaki komutları sırasıyla çalıştırınız:
1. platform-tools klasöründe komut penceresi açılır
2. Aşağıdaki komutlar sırasıyla çalıştırılır
adb shell su run-as packageName cat /data/data/packageName/databases/users >/sdcard/users.sqlite
Ctrl+C'ye basıldıktan sonra
adb pull /sdcard/users.sqlite C:\Users\{Kullanici}\Desktop\users.sqlite
Not: Bu komutları bir batch dosyası (.bat ile biten dosya) oluşturup, bu dosyaya kopyaladıktan sonra platform-tools klasörü içerisinde çalıştırabilirsiniz:
cls @ECHO OFF adb shell "su -c 'run-as paketAdi cat /data/data/paketAdi/databases/users > /sdcard/users.sqlite'" adb pull /sdcard/users.sqlite C:\Users\{Kullanici}\Desktop\users.sqlite
Yöntem 2: Kodlar ile veritabanını import veya export edebiliriz:
import android.os.Environment; import android.widget.Toast; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.channels.FileChannel; public class ExportImportDB { public ExportImportDB() { //Backup'i alinacak veritabani icin BackupFolder isminde bir klasor yaratilir. File direct = new File(Environment.getExternalStorageDirectory() + "/BackupFolder"); if (!direct.exists()) { if (direct.mkdir()) { //directory is created; } } } //importing database private void importDB() { try { File sd = Environment.getExternalStorageDirectory(); File data = Environment.getDataDirectory(); String packageName="android uygulamasının paket adı. Örnek: mucayufa.android.database.simple"; String veritabaniAdi="android uygulamasının veritabanı adı. Örnek: users"; if (sd.canWrite()) { String currentDBPath = "//data//"+ packageName + "//databases//" + veritabaniAdi; String backupDBPath = "/BackupFolder/"+veritabaniAdi+".sqlite"; File backupDB = new File(data, currentDBPath); File currentDB = new File(sd, backupDBPath); FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); } } catch (Exception e) {} } //exporting database private void exportDB() { try { File sd = Environment.getExternalStorageDirectory(); File data = Environment.getDataDirectory(); String packageName="android uygulamasının paket adı. Örnek: mucayufa.android.database.simple"; String veritabaniAdi="android uygulamasının veritabanı adı. Örnek: users"; if (sd.canWrite()) { String currentDBPath = "//data//"+packageName + "//databases//" +veritabaniAdi; String backupDBPath = "/BackupFolder/"+veritabaniAdi+".sqlite"; File currentDB = new File(data, currentDBPath); File backupDB = new File(sd, backupDBPath); FileChannel src = new FileInputStream(currentDB).getChannel(); FileChannel dst = new FileOutputStream(backupDB).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); Toast.makeText(null, backupDB.toString(), Toast.LENGTH_LONG).show(); } } catch (Exception e) {} } }