Turkcell | Geleceği Yazanlar

GELECEĞİ YAZANLAR BLOG

Yeni Blog Yaz

SQLite Android Entegrasyonu Nasıl Yapılır?

Android uygulamalarında yerel olarak veritabanı ihtiyacını karşılamak istediğimizde SQLite kullanmamız gerekir. Android işletim sistemi de arka planda tüm mesajlarınızı, rehberdeki kontaklarınızı vb. verilerin hepsini SQLite aracılığıyla saklar ve Contacts Providerlar aracılığı ile biz geliştiricilere sunar. İsterseniz veritabanını uygulama içerisinde oluşturup dinamik olarak uygulamanın çalışması esnasında veri girerek, güncelleyerek, silerek yönetebilirsiniz. Bazen önceden hazırlanmış bir veritabanını uygulamaya entegre etme ihtiyacı hissederiz. Örneğin, içinde tüm Türkçe kelimeleri ve İngilizce karşılıklarını saklayan ve 200 bin kelime barındıran bir veritabanını sözlük uygulamasında kullanmak isteyebiliriz. İşte böyle durumlarda bu yazı size yardımcı olacaktır.

Elinizde bir SQLite veritabanı mevcut olabilir veya siz dışarda herhangi bir üçüncü parti SQLite programıyla bir veritabanı oluşturabilirsiniz ve onu uygulamaya entegre edebilirsiniz. Biz bu yazıda üçüncü parti bir SQLite programıyla veritabanı oluşturup, onu bilgisayara kayıt edip oradan da uygulamamıza aktaracağız. Bunun için öncelikle aşağıda bağlantısını verdiğim yazılımı indireceğiz.

http://sqlitebrowser.org/ adresinden işletim sisteminize göre programı indirebilirsiniz. Ben Windows işletim sistemi için olanı indirdim ve programı açtığımda aşağıdaki gibi bir ekranla karşılaştım.

Yukarıdaki ekran görüntüsünde dikdörtgen içine aldığım alanları kısaca açıklamak istiyorum:

  • New Database: Yeni bir veritabanı oluşturmak için kullanabiliriz.
  • Open Database: Var olan bir veritabanını açmak için kullanabiliriz.
  • Browse Data: Bu ekrana geçtiğimizde veritabanındaki tüm tablolardaki kayıtları tablo bazlı seçerek görüntüleyebiliriz.
  • Create Table: Buradan önceden oluşturduğumuz veya açtığımız bir veritabanına tablo ekleyebiliriz.
  • Modify Table: Daha önce oluşturduğumuz tabloyu değiştirmek için kullanabiliriz.
  • Delete Table: Daha önce oluşturduğumuz tabloyu silebiliriz.

Şimdi işlemimize devam edelim ve "sozluk" isminde bir veritabanı oluşturalım.

"New Database" düğmesine tıkladığımızda bir diyalog açılıyor ve bu veritabanını nereye kayıt edeceğimizi soruyor. Masaüstünü seçebilirsiniz, oraya uzantısız bir şekilde verdiğiniz isimde veritabanını oluşturacak. Dosya ismine ismine "sozluk" yazalım. Kayıt ettiğimizde aşağıdaki gibi bir ekran gelecek ve tablo oluşturmamızı isteyecek. Burada "kelimeler" isminde tablo oluşturalım ve içerisinde "kelimeId", "kelimeTr", "kelimeEn" sütunları olsun (Add Field düğmesine tıklayarak ekleyebilirsiniz). Ekran görüntümüz şu şekilde olacak:

"kelimeId" alanını INTEGER ve otomatik artan olması için AUTOINCREMENT tanımlıyoruz.

"kelimeTr" alanını ve "kelimeEn" alanını TEXT olarak tanımlıyoruz.

Daha sonra devam ediyoruz ve ilk resimdeki "Browse Data" düğmesine tıklayarak birazcık kayıt ekleyelim. Sağ tarafta bulunan "New Record" düğmesine tıklayarak aşağıdaki gibi dolduruyoruz:

Şekildeki görüntüyü elde ettik ve programı kapatalım. Bu noktada "Kayıt etmek istiyor musunuz?" diye bir uyarı çıkacak, evet diyelim ve masaüstünde "sozluk" isminde uzantısız bir dosya olarak veritabanımızı yaratmış olacağız.

Şimdi Eclipse veya Android Studio üzerinde bir proje açalım. Ben Eclipse kullanarak projemi oluşturacağım ve masaüstündeki veritabanını projenin assets klasörüne atacağım.

Android işletim sistemi üzerinde SQLite veritabanını kullanabilmek için SQLiteOpenHelper sınıfını extend etmek gerekir. Bir tane DatabaseHelper sınıfı yazalım ve içerisinde bu harici SQLite veritabanını projemize kopyalayacak kodu da yazalım.

public class DatabaseHelper extends SQLiteOpenHelper {
private static final int VERSION = 1;
private static final String DB_PATH = "/data/data/com.gelecegiyazanlar.orneksozluk/databases/";
private static final String DB_NAME = "sozluk";
private SQLiteDatabase sqLiteDatabase;
private Context mContext;
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, VERSION);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}

Normalde Android'de veritabanını oluşturacağımız zaman onCreate ve onUpgrade metodlarını kullanırız. Bu sefer dışarıdan kopyalama yapacağımız için bunların içi boş olacak. Burada önemli olan kısım, DB_PATH ve DB_NAME parametreleridir. DB_NAME parametresi SQLite programında oluşturduğumuz veritabanı ismiyle aynı olmalıdır. Orada sözlük verdiğimiz için burada da sözlük vermemiz gerekir.

Android uygulamalarında oluşturulan veritabanları /data/data/paket_adi/databases/ altına oluşur. Bu yüzden DB_PATH parametresini kopyalayacak hedefi yazmamız gerekiyor. Burada önemli olan değer de uygulamanın paket adıdır.

com.gelecegiyazanlar.orneksozluk olarak yazdım ben.

    /*
     * Eğer veritabanı yoksa kopyalayıp oluşturacak varsa hiçbir şey yapmayacak
     * metodumuz.
     */
    public void createDataBase() throws IOException {

        boolean dbExist = checkDataBase();

        if (dbExist) {
            /*
             * Veritabanı daha önce mevcut o yüzden herhangi bir işlem yapmaya
             * gerek yok.
             */
        } else {
            /*
             * Veritabanı daha önce hiç oluşturulmamış o yüzden veritabanını
             * kopyala
             */
            this.getReadableDatabase();
            try {
                copyDataBase();
            } catch (IOException e) {

                throw new Error("Veritabanı kopyalanamadı");

            }
        }

    }

Uygulamamıza createDatabase metoduyla devam ediyoruz. createDatabase metodu, daha önce veritabanının oluşturulup oluşturulmadığını kontrol etmek için kullanılır. createDatabase metodu bu işlemi yapabilmek için checkDatabase metodunu kullanır. checkDatabase metodu sonuç olarak "true" dönüyorsa, o veritabanı daha önce oluşturulmuş ve metodun hiç bir şey yapmasına gerek yok demektir. Aynı metod sonuç olarak "false" dönüyorsa, o veritabanı daha önce oluşturulmamış demektir. Bu durumda createDatabase metodu copyDatabase metodunu çağırarak, daha önce oluşturulmuş veritabanını assets klasöründen alıp uygulamanın altındaki /data/data/com.gelecegiyazanlar.orneksozluk/databases altına kopyalar. checkDatabase ve copyDatabase metodlarını aşağıda görebilirsiniz.

/*
     * Veritabanı daha önce oluşturulmuş mu oluşturulmamış mı bunu öğrenmek için
     * yazılan method.
     */
    private boolean checkDataBase() {
        SQLiteDatabase checkDB = null;
        try {
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
        } catch (SQLiteException e) {

        }
        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }

Veritabanının varolup olmadığını kontrol etmek amacıyla yapılmış bir metot. Yukarıda anlattığım createDatabase metotu içerisinde çağırılıyordu.

/*
 * Veritabanını assets'ten alıp
 * "/data/data/com.gelecegiyazanlar.orneksozluk/databases/" altına
 * kopyalayacak metod
 */
 private void copyDataBase() throws IOException {
 InputStream myInput = mContext.getAssets().open(DB_NAME);
 String outFileName = DB_PATH + DB_NAME;
 OutputStream myOutput = new FileOutputStream(outFileName);
 byte[] buffer = new byte[1024];
 int length;
 while ((length = myInput.read(buffer)) > 0) {
 myOutput.write(buffer, 0, length);
 }
 myOutput.flush();
 myOutput.close();
 myInput.close();

 }

/*
 * Uygulama içinde kullanacağımız db örneği
 * */
 public SQLiteDatabase getDatabase(){
 return sqLiteDatabase;
 }

Uygulama içerisinde sorgu yollamak için DatabaseHelper sınıfındaki sqLiteDatabase'ye ihtiyacımız var. Bu yüzden buna da bir tane getter yazıyoruz.

/*
     * Veritabanını uygulamada kullanacağımız zaman açmak için gerekli
     * metod
     */
    public void openDataBase() throws SQLException {
        String myPath = DB_PATH + DB_NAME;
        sqLiteDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    }

    /*
     * Veritabanını işimiz bittiğinde kapatmak için kullanacağımız metod
     */
    @Override
    public synchronized void close() {
        if (sqLiteDatabase != null)
            sqLiteDatabase.close();
        super.close();
    }

Son metotlarımız ise uygulama içinde çağıracağımız metotlardır.

Uygulama içerisinde veritabanını kullanmak istediğimizde openDatabase ve veritabanı ile işimiz bittiğinde close metotunu çağıracağız.

Şimdi DatabaseHelper sınıfımız bitti. Aslında her şeyi bizim için otomatize ediyor. Bizim sadece DB_NAME ve DB_PATH parametreleri ayarlayıp veritabanını assets klasörüne atmamız yetiyor. Arkamıza yaslanıyoruz ve tüm işlemleri o hallediyor.

Şimdi MainActivity üzerinden kısa bir örnek yapıp yazımızı noktalayalım:

Çok basit bir uygulamamız var iki tane EditText ve bir tane düğmeye sahip. Türkçe kelimeyi girip İngilizce'ye çevireceğiz.

public class MainActivity extends ActionBarActivity {
    
    DatabaseHelper dbHelper;
    EditText trEditText,enEditText;
    Button cevirButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        dbHelper = new DatabaseHelper(this);
        try {
            dbHelper.createDataBase();
            dbHelper.openDataBase();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        trEditText = (EditText)findViewById(R.id.trEditText);
        enEditText = (EditText)findViewById(R.id.enEditText);
        cevirButton = (Button)findViewById(R.id.cevir);
        
        cevirButton.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                String turkceKelime = trEditText.getText().toString();
                Cursor crs = dbHelper.getDatabase().query("kelimeler", new String[]{ "kelimeEn" }, "kelimeTr = ?", new String[]{ turkceKelime }, null, null, null);
                if(crs.getCount()>0){
                    crs.moveToFirst();
                    String ingilizceKelime = crs.getString(crs.getColumnIndex("kelimeEn"));
                    enEditText.setText(ingilizceKelime);
                }else{
                    Toast.makeText(getApplicationContext(), "Kelimenin karþýlýðý bulunamadý", Toast.LENGTH_SHORT).show();
                    trEditText.getText().clear();
                }
            }
        });
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        dbHelper.close();
    }
}

Uygulama kodlarımızda bu şekilde. DatabaseHelper sınıfından bir örnek türetiyoruz ve createDatabase ve openDatabase metotunu çalıştırıyoruz. Düğmeye tıklandığında veritabanına sorgu gönderip, kaydın olup olmadığını soruyoruz.

Yazı biraz uzun oldu ama neyse ki kodları Github'a koydum :).

Aşağıdaki bağlantıdan kod parçacıklarını indirip deneyerek, konuyu daha iyi şekilde anlayabilirsiniz.

12 Cevap

Doğukan

28 Mart 2015

Çok faydalı oldu. Teşekkürler...

Yorumunuz beni mutlu ettim işinize yaradıysa ne mutlu bana:) İyi günler

Mert Adsay

30 Mart 2015

ben buna benzer bir entegrasyon ile daha once uygulama oluşturdum ve veri çekme konusunda sorunsuz çalıştı ancak daha sonra veri eklemeyi denediğimde hata veriyordu. Bu örneğe bir de veri ekleme kısmı eklerseniz çok iyi olur

Ali Işıngör

30 Mart 2015

Eline sağlık Ahmet Burak :)

Bekir Dursun

01 Nisan 2015

Çok temiz bir anlatım olmuş Burak, ellerine sağlık :)

Sayfalar

Yorum yapmak için Giriş Yapın ya da Üye olun.