Android Programlama Ders 37: SQLite Veritabanı Kullanmayı Öğreniyoruz

In Mobil, Pratik by Victor CuiumjuLeave a Comment

Android Programlama Ders 37’de SQlite kullanarak verileri kaydetmeyi öğreneceğiz.

Geçen derslerimizde verileri kaydetmek için en basit yöntemi kullandık – Preferences. Ama büyük verileri kaydetmek için bu yöntem pek uygun değildir. Bu derste verileri kaydetmek için SQLite veri tabanı kullanacağız.

İlk başta uygulamanın ve veritabanının çalışmanın prensipleri hakkında konuşalım.

Uygulamada veri tabanına bağlandığımız zaman, veri tabanının ismi ve versiyonunu belirtmemiz gerekiyor. Bu aşamada üç tane durum oluşabiliyor:

1)      Veri tabanı mevcut değil. Bu durum uygulamanın ilk açılışında olabilir. Bu durumda uygulama veri tabanı ve tüm tabloları kendi oluşturuyor. İleride uygulama bu veri tabanıyla çalışıyor.

2)      Veri tabanı mevcut ama versiyonu eski. Bu durum uygulamayı güncellediğimiz zaman karşımıza gelebilir. Mesela uygulamanın yeni versiyonunda yeni tablolar veya sütunlar mevcut olabilir. Bu durumda veri tabanı tabloları veya sütunları güncelleniyor veya yenisini oluşturuyor.

3)      Veri tabanı mevcut ve versiyonu yeni. Bu durumda uygulama veritabanıyla problemsiz bağlanıyor ve çalışıyor.

Bu durumları işletmek için DBHelp klası oluşturacağız. Bu klas SQLiteOpenHelper soyut (abstract) klasından metotları miras alacak. DBHelp klası kullanarak veritabanı oluşturma ve güncelleme yapabileceğiz.

onCreate – metod veritabanı oluşturmak için kullanılıyor.

onUpgrade – metod veritabanı güncellemek için kullanılıyor.

Konuyu daha iyi anlamak için basit bir uygulamayı oluşturalım. Uygulamamız kullanıcı bilgileri içerecek (isim ve mail). Verileri ekrandan gireceğiz ve sonucu, bildirimleri (Log) kullanarak alacağız.

Projeyi oluşturalım:

  • Project name: P0037_SimpleSQLite
  • Build Target: Android 4.2
  • Application name: SimpleSQLite
  • Package name: tr.example. simplesqlite
  • Create Activity: MainActivity

 

Main.xml’i açalım ve ekranı oluşturalım:

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical">
 <LinearLayout
 android:id="@+id/linearLayout1"
 android:layout_width="match_parent"
 android:layout_height="wrap_content">
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Name"
 android:layout_marginLeft="5dp"
 android:layout_marginRight="5dp">
 </TextView>
 <EditText
 android:id="@+id/etName"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_weight="1">
 <requestFocus>
 </requestFocus>
 </EditText>
 </LinearLayout>
 <LinearLayout
 android:id="@+id/linearLayout3"
 android:layout_width="match_parent"
 android:layout_height="wrap_content">
 <TextView
 android:id="@+id/textView2"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Email"
 android:layout_marginLeft="5dp"
 android:layout_marginRight="5dp">
 </TextView>
 <EditText
 android:id="@+id/etEmail"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_weight="1">
 </EditText>
 </LinearLayout>
 <LinearLayout
 android:id="@+id/linearLayout2"
 android:layout_width="match_parent"
 android:layout_height="wrap_content">
 <Button
 android:id="@+id/btnAdd"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Add">
 </Button>
 <Button
 android:id="@+id/btnRead"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Read">
 </Button>
 <Button
 android:id="@+id/btnClear"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Clear">
 </Button>
 </LinearLayout>
 </LinearLayout>

İki tane giriş alanı ve üç tane butonu içeriyor. Ekleme (Add) , okuma (Read) ve silme (Clear) butonu olacak.

MainActivity.java oluşturalım:

import android.app.Activity;
 import android.content.ContentValues;
 import android.content.Context;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
 import android.widget.EditText;
 
 public class MainActivity extends Activity implements OnClickListener {
 
   final String LOG_TAG = "myLogs";
 
   Button btnAdd, btnRead, btnClear;
   EditText etName, etEmail;
 
   DBHelper dbHelper;
 
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
 
     btnAdd = (Button) findViewById(R.id.btnAdd);
     btnAdd.setOnClickListener(this);
 
     btnRead = (Button) findViewById(R.id.btnRead);
     btnRead.setOnClickListener(this);
 
     btnClear = (Button) findViewById(R.id.btnClear);
     btnClear.setOnClickListener(this);
 
     etName = (EditText) findViewById(R.id.etName);
     etEmail = (EditText) findViewById(R.id.etEmail);
     
     // veritabani olusturmak ve guncellemek icin nesneyi olusturuyoruz
     dbHelper = new DBHelper(this);
   }
 
   
   @Override
   public void onClick(View v) {
     
     // verileri icin nesneyi olusturuyoruz
     ContentValues cv = new ContentValues();
     
     // giris alanindan verileri aliyoruz
     String name = etName.getText().toString();
     String email = etEmail.getText().toString();
 
     // veritabaniya baglaniyoruz
     SQLiteDatabase db = dbHelper.getWritableDatabase();
     
 
     switch (v.getId()) {
     case R.id.btnAdd:
       Log.d(LOG_TAG, "--- Insert in mytable: ---");
       // giricek verileri hazirliyoruz: sutunun ismi ve degeri
       
       cv.put("name", name);
       cv.put("email", email);
       // verileri ekliyoruz ve ID aliyoruz
       long rowID = db.insert("mytable", null, cv);
       Log.d(LOG_TAG, "row inserted, ID = " + rowID);
       break;
     case R.id.btnRead:
       Log.d(LOG_TAG, "--- Rows in mytable: ---");
       //mytable tablodan verileri sorguluyoruz ve Cursor aliyoruz 
       Cursor c = db.query("mytable", null, null, null, null, null, null);
 
       // Cursoru birinci sutune yerlestiriyoruz
       // sutunu bulmadigi zaman false gonderecek
       if (c.moveToFirst()) {
 
         //sutunlerin numarayi bulmak icin isimleri kullaniyoruz
         int idColIndex = c.getColumnIndex("id");
         int nameColIndex = c.getColumnIndex("name");
         int emailColIndex = c.getColumnIndex("email");
 
         do {
           // sutun numarayi kullanarak degeri alip loga yazdiriyoruz
           Log.d(LOG_TAG,
               "ID = " + c.getInt(idColIndex) + 
               ", name = " + c.getString(nameColIndex) + 
               ", email = " + c.getString(emailColIndex));
           // sonraki sutune geciyoruz
           // sutun olmadigi zaman false gonderiyoruz ve cikiyoruz        } while (c.moveToNext());
       } else
         Log.d(LOG_TAG, "0 rows");
       c.close();
       break;
     case R.id.btnClear:
       Log.d(LOG_TAG, "--- Clear mytable: ---");
       // verileri siliyoruz
       int clearCount = db.delete("mytable", null, null);
       Log.d(LOG_TAG, "deleted rows count = " + clearCount);
       break;
     }
     // veritabaniyla baglantiyi kapatiyoruz
     dbHelper.close();
   }
   
   
 
   class DBHelper extends SQLiteOpenHelper {
 
     public DBHelper(Context context) {
       //super klasin tasarimci 
       super(context, "myDB", null, 1);
     }
 
     @Override
     public void onCreate(SQLiteDatabase db) {
       Log.d(LOG_TAG, "--- onCreate database ---");
       // tabloyu olusturuyoruz
       db.execSQL("create table mytable ("
           + "id integer primary key autoincrement," 
           + "name text,"
           + "email text" + ");");
     }
 
     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
     }
   }
 
}

 

Yukarıdaki verdiğim kodu inceleyelim.

Activity – onCreate metodunda nesneleri belirtiyoruz ve işleticiyi bağlıyoruz. Sonra DBHelper klası dbHelper veritabanı yönetmek için nesneyi oluşturuyoruz.

Activity – onClick metodunda butona basılmasını işletiyoruz.

ContentValues klası tablonun sütunları ve değerlerini belirtmek için kullanacağız. Cv nesneyi oluşturuyoruz. Giriş alanından verileri kaydediyoruz. getWritableDatabase metodu kullanarak veritabanına bağlanıyoruz ve SQLiteDatabase nesneyi alıyoruz. Bu nesne veritabanıyla çalışma imkanı sunacaktır. Nesneye insert (eklemek) ile verileri ekliyoruz, query (sorgulamak) ile verileri okuyoruz ve delete (silmek) ile verileri siliyoruz. Sonraki aşamada hangi butona basıldığını öğreniyoruz:

btnAdd – verileri mytable tabloya ekliyor. Cv nesneyi sütunun ismi ve değeri ile dolduruyoruz. Biz name ve email alanları giriyoruz. Id otomatik (primary key autoincrement) olarak değeri alıyor. insert – metodu çağırıyoruz ve tablonun ismi ve cv nesneyi iletiyoruz. İkinci argüman tabloya boş sütunu eklemek için kullanılır. Bu özelliği şu anda kullanmadığımız için null değeri iletiyoruz. Insert metodu bize eklenen sütunun ID’sini veriyor. Biz ID’yi kaydediyoruz ve bildirimde (LogCat’ta görebilirsiniz) gösteriyoruz.

btnRead – verileri mytable tablosundan okuyor.Verileri okumak için query metodu kullanılıyor. Giriş olarak tablonun ismi, sütunların listesi, seçme şartları, gruplama ve sıralama geçerli. Uygulamamızda tüm verileri kullandığımız için gruplama ve sıralama yerinde null değeri kullanacağız. Sadece tablonun ismini kullanacağız. Metod sonuç olarak Cursor klasın nesnesini verecek. Bu nesneyi veri tablosu olarak sayabiliriz. moveToFirst metod – Cursor’da ilk kayıtı aktif haline getiriyor aynı anda daha önce veri girip girmediğini kontrol ediyor.

Sonraki aşamada getColumnIndex metodu kullanarak Cursor’taki sütunların isimlerini kullanıp, sütunların numaralarını öğreniyoruz. Bu numaraları getInt ve getString metodunda verileri okumak için kullanacağız. moveToNext metodu kullanarak Cursor’da tüm sütunları tarayabiliriz. Kayıt olmadığı zaman bildirime (Log) – 0 rows yazdırıyoruz. Sonunda Cursor’u close metodu kullanarak kapatıyoruz, çünkü tekrar kullanmayacağız.

btnClear – tabloyu siliyoruz. delete metodu kullanarak kayıtları siliyoruz. Giriş olarak tablonun ismini veriyoruz. Ve null (boş) değeri silme şartları için belirtiyoruz. Bu demek ki tümünü silecek. Bu metod sonuç olarak silinen kayıtların sayısını gönderiyor.

Son aşamada close metodu kullanarak veritabanıyla bağlantıyı kapatıyoruz.

DBHelper klasta super tasarımcıyı çağırıyoruz ve context,mydb,null ve 1 değişkenleri gönderiyoruz.

Context – uygulamanın temel metodlarını uygulama imkanı sunuyor.

Mydb – veritabanın ismi.

Null – kürsörü (Cursor) kullanmayacağımız için null (boş) değiri gönderiyoruz.

1 – veritabanın versiyonu.

onCreate metodunda execSQL metodu kullanarak SQL sorguyla tabloyu oluşturuyoruz. Bu sorgu veritabanı olmadığı zaman kullanılıyor. Sorgu gördüğümüz gibi idname ve email sütunuyla mytable tablosunu oluşturuyor.

onUpgrade metodunu şu anda boş bırakıyoruz, çünkü tek bir veritabanı kullanacağız.

Kaydedelim ve uygulamayı çalıştıralım. Veritabanı çalıştırarak çalışan metodları, bildirimleri (Log) kullanarak inceleyeceğiz.

OmerAslan

Bildirimlere bakalım:

— onCreate database —
— Insert in mytable: —
row inserted, ID = 1

onCreate metodu çağırdığını görüyoruz. Bu demektir ki veritabanı oluşturacak çünkü ilk defa uygulamayı çalıştırıyoruz ve daha önce veritabanı oluşturmadık. Veritabanı oluşturduktan sonra onunla çalışabiliyoruz. Sonraki satırda insert (ekle) metodu çağırdığını görüyoruz. Bu metod bize ID = 1 geri gönderdi.

Bir kayıt daha ekleyelim.

Osman

Bildirime bakıyoruz:

— Insert in mytable: —
row inserted, ID = 2

Bu sefer onCreate metodunu görmüyoruz. Çünkü veritabanını daha önce oluşturduk. Yeni kayıtlarımızın ID = 2 olduğunu görüyoruz.

Tablonun içeriğine bakalım. Bunu yapmak için Read butonuna basmamız gerekiyor.

Bildirime bakalım:

— Rows in mytable: —
ID = 1, name = Omer Aslan, email = [email protected]
ID = 2, name = Osman bey, email = [email protected]

Daha önce girdiğimiz kayıtları görüyoruz.

Clear butonuna basalım ve tabloyu silelim. Bildirimlere bakıyoruz:

— Clear mytable: —
deleted rows count = 2

İki kayıt silindi. Şimdi tablonun içiriğe bakalım Read:

— Rows in mytable: —
0 rows

Kayıtlar bulunamadı.

Ders Sonu Notları:

Bu derste önemli olan, veritabanıyla çalıştığımız zaman iki klası kullandık.

DBHelper klas SQLiteOpenHelper metotları miras alıyor. Bu klasta veritabanı oluşturuyoruz ve versiyonun numarasını belirtiyoruz. getWritableDatabase metodu veritabanına bağlanıyor ve SQLiteDatabase nesneyi gönderiyor. Close metodu veritabanıyla bağlantıyı kapatıyor. Ve veritabanı oluşturmak veya güncellemek için onCreate ve onUpgrade metodu kullanıyoruz.

SQLiteDatabase verilerle çalışmak için metotları (Ekle, sil, oku, güncelle) içeriyor.

Gelecek derslerimizde aynı uygulamayı geliştireceğiz. Yeni imkanları (güncelleme ve belirli kayıt silme) ekleyeceğiz. Bunun için query ve delete metotlarını kullanacağız.