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 ) 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) {}
    }
  
}

© 2019 Tüm Hakları Saklıdır. Codesenior.COM