Android ile ilgili merak edilen konulardan birisi de veritabanı kullanımıdır.Günümüzde popüler olan veritabanları Microsoft SQL Server, MySQL, Oracle vb. dir. Ancak Android’den bunlara doğal yöntemler ile erişmek mümkün değildir, çünkü gerekli kütüphaneler bulunmamaktadır.Bu veritabanları büyüklükleri sebebiyle Android cihazına kurulamazlar.Bu veritabanlarına ancak bir web servis aracılığıyla erişilebilir.

Android’te lokal veritabanı olarak sadece SQLite isimli dosya tipi veritabanı yönetim sistemi kullanılabilir. SQLite açık kaynak kodlu bu sebeple birçok platformda kullanılabilir.SQLite ilişkisel ve işlemsel güçlü bir veritabanıdır.Android’in rehber, ajanda gibi kendi uygulamalarında da bu veritabanı kullanılır.

Ders anlatım videosuna gitmek için TIKLAYINIZ.

Android ile veritabanı uygulamaları geliştirirken yapılması gerekenler anlatılacaktır. Öncelikle kısaca ihtiyaç duyulan yapılardan bahsedelim: 

1. SQLite Veritabanı 
2. SQLiteOpenHelper sınıfı 
3. SQLiteDatabase sınıfı 
4. Veri ekleme ve güncelleme için ContentValues sınıfı 
5. Select işlemleri için Cursor sınıfı 

1-SQLiteVeritabanı 

Bu veritabanı her Android cihazında gömülü olarak gelir. Bu nedenle Android cihazı veritabanının kurulmasına ihtiyaç duymaz. Android’te veritabanı kullanan her uygulama kendi private veritabanına sahip olduğu için veritabanında yönetici paneli bulunmaz. Bize düşen görev sadece sql işlemleri yapmaktır, diğer tüm işleri Android kendisi düzenler. 

2- SQLiteOpenHelper 

Veritabanı oluşturmak için tasiye edilen yöntem SQLiteOpenHelper sınıfını kullanmaktır.

Bu sınıfı kullandığınızda database oluşturma ve güncelleme işlemlerini doğru zamanlarda ve doğru şekilde yapılması işini sisteme devretmiş olursunuz.

Ayrıca getReadableDatabase() ve getWriteableDatabase() isminde iki metod daha vardır. Bu metodlardan ilki okuma modunda SQLiteDatabase nesnesi dönderirken, ikincisi yazma modunda SQLiteDatabase nesnesi dönderir. 

3-SQLiteDatabase Sınıfı

open, query, update ve close işlemlerini sağlayan sınıftır. Daha özel olarak ifade etmek istersek, insert(), rawQuery(), update() ve delete() metodlarını içerir. 
Ayrıca execSQL() metodu sayesinde SQL ifadelerini direkt çalıştırmayı sağlar. 

4-ContentValues sınıfı 

insert() ve update() metodlarının parametrelerinden biri ContentValues sınıfıdır. Bu sınıf key/values şeklinde değerlerlerin belirtilmesini sağlar. Burada key tablo sütunu adını gösterirken, value ise o sütünun değerini gösterir. 

5-Cursor Sınıfı

  • Bir query Cursornesnesi dönderir. Query sonucunda dönen her bir satır bir Cursor nesnesi tarafından temsil edilir. Bu sayede, Android query sonuçlarını verimli bir şekilde bufferlayabildiği için tüm veriyi memory’e yüklemeye ihtiyaç duymaz. 

  • startManagingCursor(c) : Cursor üzerinde işlemler yapabilmeyi sağlar.
  • getCount() : Veritabanındaki kayıt sayısını döndürür.
  • moveToFirst() : Cursor veri tabanındaki ilk kayda gider
  • moveToNext() : Cursor bulunduğu konumdan bir sonraki kayda geçer.
  • isAfterLast() : Son satırdan bir önceki mi sorgulaması yapar

Bunların dışında  getColumnNames(), getColumnIndex(), getString(), getInt() methodları veritabanı işlemleri sırasında sıklıkla kullanılmaktadır.
Gerekli işlemler yapıldıktan sonra Cursor nesnesi close() metodu ile kapatılmalıdır. 

1.Adım

Android Studio da yeni bir proje açıyoruzActivity main ekranında şekildeki gibi linearLayout,TableLayout,text view, edit text ve butonlar yerleştirilmelidir.

2.Adım

Bu adımlardan sonra sol kısımda java altında com.example.(isim) ile başlayan klasöre sağ tıklayıp yeni bir class açıyoruz. Adını veritabani yapıyoruz.

3.Adım

veritabani clasında aşağıdaki kodları yazıyoruz

3.Adım kodların açıklaması

Burada ilk olarak sınıfımızı SQLiteOpenHelper sınıfından extend ettik yani türettik.

SQLite veritabanını kullanabilmemiz için bu zorunludur.

Daha sonra 2 adet değişken tanımladık. Birisi veritabanı adını tutacak diğeri de sürümünü.

Daha sonra bu Veritabani adlı sınıfımızın yapıcısını oluşturduk. Yapıcılar bildiğiniz gibi sınıf ismi ile aynı adı taşırlar. Bu yapıcı, Context tipinde bir c nesnesini parametre olarak aldı.c ismini rastgele verdim.

Context ise uygulama ortamı için genel bilgileri, durumları vs tutan ve uygulamaya özgü kaynaklara ve classlara erişmeyi sağlayan arayüz diyebiliriz.Genellikle uygulamanın diğer kısımlarındaki verilere ulaşmak için kullanılır.  

Bu yapıcının içinde de super metodunu çağırdık ve parametre olarak; c nesnesi, veritabanının adını tutan değişken, null, veritabanı sürümü olarak 4 adet parametre verdik. Buraya kadar yaptıklarımız zorunlu.

*Eğer veritabanı adlı sınıfın altı çizili ise yanındaki kırmızı çarpıya basıp Add Unimplement Method diyerek 2 adet metod ekliyoruz.

Kalıtım yaptığımız için implement etmemiz gereken 2 tane metod verdi bize. Yani bu 2 metodu mutlaka kendi sınıfında kullanmalısın dedi.

onCreate olanda genelde veritabanı işlemleri oluşturulur. Burada yapılacak olan işlemler bir defalığına yapılır.

onUpgrade Veritabanında tablo yapısında bir değişiklik varsa ve eski sürümlerde güncelleme gerekiyorsa, bu metot içerisinde ilgili sorgular çalıştırılır. Hangi sürümler arasında geçiş olacağını eskiversiyon ve yeniversiyon değişkenleriyle anlayabiliriz. Gerekli kontrol yapıları ile veritabanı güncelleme işlemlerini bu metod altında yapmalıyız. Biz burada basitçe tabloyu silip baştan yaratmayı tercih ettik.

onCreate() metodunun içerisine, parametre olarak aldığı db nesnesinin execSQL() metodunu yazdık. Bu execSQL komutu da oluşturduğumuz SQL sorgusunu veritabanında çalıştırarak, ilgili tabloları yaratmamızda bize yardımcı oldu.

Biz sorgumuzda ogrencibilgi adında bir tablo oluşturduk. Bu tablo da TEXT tipinde adsoyad, sehir ve Int tipinde yas sütunlarına sahip oldu. Android’de genelde TEXT,INT ve REAL veri tipleri kullanılır.

onUpgrade() metodunda ise yine db.execSQL() metodunu kullandık ve parametre olarak bir sorgu yazdık. Bu sorgu, eğer öyle bir tablo varsa; onu sil demektir. Bir alt satırında da bu db nesnesini onCreate() metoduna gönderdik. Bunları yazmak zorunludur.

4.Adım

Bu işlemleri yaptıktan sonra şimdi MainActivity sınıfımızı açalım. İlk aşamada butonları, editview’larıbağlama işlemini yapalım. Bunları yaptıktan sonra görüntümüz şu şekilde olacaktır.

4.adım kod açıklaması

1 numaralı alanda nesneleri tanımladık.

2 numaralı alanda, biraz önce oluşturduğumuz veritabani adlı sınıftan v1 nesnesi oluşturduk.

3 numaralı alanda bu v1 nesnesinin new ile bellekte yer kaplamasını sağladık.

4 numaralı alanda nesneleri bağladık

5.Adım

İlk olarak kayitekle() metodu yazılır. Kayıtekle metodunu onCreate dışına yazıyoruz.!!

Daha sonra kaydet.setOnClickListener kodunu onCreate içerisine yazıyoruz.!!

5.adım kod açıklaması

Burada veritabanı ile ilgili işlemleri yapacağız.

0 numaralı alanda bilgileri göstereceğimiz text alanına scroll çubuğu ekledik.Bunun için activity_mainde textviewbilgilere android:scrollbars=”vertical” eklemeliyiz

1 numaralı alanda, kaydetme butonuna tıklandığında yapılacakları yazacaktık. Bunları try içerisinde yaptık çünkü veritabanında hata olursa uygulama patlamasın hemen. Burada ekleme metoduna dört parametre gönderdik. Bu parametreler, edittext’e girdiğimiz değerler.

2 numaralı alanda bağlantıyı kapattık.

3 numaralı alanda ekleme metodumuzu oluşturduk ve dört parametre alıyor. Bu metod artık onCreate parantezleri dışına çıkılarak yazılır.

4 numaralı alanda v1 nesnesi üzerinden getWritableDatabase() metodunu çağırdık. Çünkü biz şuan ekleme yani bir yazma işlemi yapacağız.  Bu işlemi de db nesnesine attık.

5 numaralı alanda zorunlu olarak ContentValues sınıfından bir nesne oluşturduk.

6 numaralı alanda bu nesnenin put() metodunu çağırarak ekleme yaptık Hangi alanları ekledik? Parantez içinde ilk parametre nerede tutacağımızı gösterir. 2.parametre ise neyi tutacağız onu gösterir. Bu tutulacak olan değerleri, ekleme() metodunda parametre olarak almıştık zaten.

Son 7 numaralı alanda da db’nin insertOrThrow() metodunu çağırdık. Bu metod veritabanına ekleme yapar. Son aşamadır. Bunun yerine insert() metodu da kullanılır fakat bu daha performanslıdır. İlk parametresi tablo adı, diğer parametre null, son parametre ise ContentValues nesnemizdir.

6.Adım

Kayitgoster ve kayitgetir metodu onCreate dışında yazmaya devam ediyoruz.

1 numaralı alan için

Bu metod içerisinde de db nesnesi oluşturduk fakat bu sefer veri tabanından kayıt okuyacağımız için getReadableDatabase() metodunu kullandık.

Ardından bir cursor tanımladık ve içerisine bir query yazdık. Yazdığımız query içerisine aldığı “öğrencibilgi” tablosu içinde select işlemi yapacak bunları da sutunlar değişkeninden alacaktır.

5 tane null kelimesi ise; sırasıyla; where koşulu, where koşulunun değerleri, groupby, having, orderby’dır. Biz bunların belirlenmesini istemediğimiz için bunları null belirledik.En sonunda ise oluşturduğumuz cursor’u return ettik.

2 numaralı alan için

Bu metod içerisine bir cursor değeri alıyor. Ardından içinde StringBuilder türünde bir builder değişkeni oluşturuyor. Eğer uygulama içerisinde birden çok string türünde değeri birleştirmek istiyorsak StringBuilder kullanılır. Uygulamamamız içerisinde birden fazla kayıt olabileceği için StringBuilderkullanmak işimizi kolaylaştıracaktır.

Ardından ad,soyad,yas ve sehir değişkenleri oluşturup, metot içerisine parametre olarak gelen cursor nesnesinin getColumnIndex() metodunu kullanarak ogrencibilgi tablosunun kolon isimleri addsoyadd,yass ve sehirr olanlarını bu değişkelere  getString() metodları yardımıyla gönderiyoruz.

builder.append ( “ad:” ) .append (+ + \ \ “ ekle );

Burada “ad” kelimesini bas ardından yanına add bilgisini ekle ve \n ekleyerek bir satır alta in diyoruz.

EK NOT: StringBuilder nedir?

String = Değiştirilemez, StringBuilder=Değiştirilebilir

String objenin içine saklanan değer değiştirilemez. Peki nasıl oluyor da ben istediğim zaman string bir değişkeni değiştirebiliyorum diye sorabilirsiniz. Sizin görmüş olduğunuz nesene aynı nesne değildir. String objesi değişmek için arka planda yeni bir String nesnesi oluşturur. Her değişikilte yeni bir String class’ı oluşuyor. Bu da zamanla performansı kötü yönde etkiliyor.

StringBuilder objelerini kullanırsanız performans açısından daha iyi sonuçlar elde edersiniz. Çünkü Objenin içinde saklanan değer değiştirilebilir bir değerdir.

7.Adım

goster buton click olayı onCreate içerisine yazılır.!!

Bu iki metodu (KayitGetir() ve KayitGoster() metodlarını) programımız içerisinde çağıralım.

Çağırma işlemini onCreate() metodu içerisinde yaparsak, uygulama sayfası ilk açıldığında veri tabanında bulunan kayıtları ekrana getirebiliriz.

Çağırma işlemini uygulamaya her yeni kayıt eklediğimizde listemizin güncellenmesi için kayit butonunun Click olayı altında da yapalım.

Şimdiye kadar yaptıklarımızın ekran görüntüsü: Burada bilgileri girip Ekle tuşuna basınca verileri kaydediyor ve Göster deyince de bu şekilde verileri gösteriyor.

8.Adım

Şimdi kalan kısmı yapalım. MainActivity.java dosyasını kodlamaya devam ediyoruz. Silmeişlemi için de aşağıdaki gibi kodları yazalım.

Önce silme metodu yazılacak.Silme metodu onCreate dışına yazılacak!!

Sil.setOnClick olayı metod yazıldıktan sonra yazılacak.Sil onclick işlemi yine onCreate içine yazılacak!!

Burada da silme butonuna tıklandığında bir listener oluşturduk ve bu listener içerisinde click olayında, 

silme() metodunu çağırdık. Parametre olarak da, hangi veriye göre silme yapacağız onu yazdık. Burada ada göre silme yapıyoruz. Yani adı girilen kişiyi silecek.

Daha sonra bu silme() metodunu oluşturduk ve içerisinde bir nevi bağlantı açtık

Yine bu db nesnesi üzerinden de delete() metodunu çağırdık Bu metoda 3 parametre verdik. İlk parametre tablo adı, 2.parametre bir nevi WHERE sorgumuz. Son parametre de soru işareti yerine gelecek olan değer. Yani gönderdiğimiz ad verisi. Bunu String tipinde bir dizi şeklinde oluşturduk.

9.Adım

Önce Guncelle metodunu onCreate dışına yazacağız.

Daha sonra güncelle.setOnClick olayını onCreate içerisine yazacağız.

Güncelleme butonu için bir Listener oluşturduk. Daha sonra Guncelle() metodunu çağırdık ve parametre olarak ad değerini gönderdik. Bu metodun içerisinde de silmeden farklı olarak ContentValues nesnesi oluşturduk ve db nesnesi üzerinden bu sefer update() metodunu çağırdık. Bu metod da 4 parametre alıyor.

Değer girip güncelle dedikten sonra kayıtları göstere tıklanınca veri güncellenmektedir.

 

veritabani class kodları

package com.example.mfurkan.veritabanicalismasi;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class veritabani extends SQLiteOpenHelper {

    private static final String VERİTABAİ_ADİ="ogrenciler";
    private static final int SURUM=1;

    public veritabani(Context c)
    {
        super(c,VERİTABAİ_ADİ,null,SURUM);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE ogrencibilgi (ad Text, soyad Text,yas Integer,sehir Text);");

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int eskiversiyon, int yeniversiyon) {
        db.execSQL("DROP TABLE IF EXISTS ogrencibilgi");
        onCreate(db);
    }
}

MainActivity class kodları

package com.example.mfurkan.veritabanicalismasi;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    Button kaydet;
    Button goster;
    Button sil;
    Button guncelle;
    EditText ad;
    EditText soyad;
    EditText yas;
    EditText sehir;
    TextView bilgiler;
    private veritabani v1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        v1=new veritabani(this);

        kaydet=(Button) findViewById(R.id.buttonkayit);
        goster=(Button) findViewById(R.id.buttongoster);
        sil=(Button) findViewById(R.id.buttonsil);
        guncelle=(Button) findViewById(R.id.buttonguncelle);
        ad=(EditText)findViewById(R.id.editTextad);
        soyad=(EditText)findViewById(R.id.editTextsoyad);
        yas=(EditText)findViewById(R.id.editTextyas);
        sehir=(EditText)findViewById(R.id.editTextsehir);
        bilgiler=(TextView)findViewById(R.id.textViewbilgiler);

        bilgiler.setMovementMethod(new ScrollingMovementMethod());

        kaydet.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                try
                {
                    kayitekle(ad.getText().toString(),soyad.getText().toString(),yas.getText().toString(),sehir.getText().toString());
                }
                finally
                {
                    v1.close();

                }
            }
        });
        Cursor cursor = kayitgetir();
        kayitgoster(cursor);
        goster.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Cursor cursor = kayitgetir();
                kayitgoster(cursor);
            }
        });

        sil.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                silme(ad.getText().toString());
            }
        });

        guncelle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Guncelle(ad.getText().toString(),soyad.getText().toString(),yas.getText().toString(),sehir.getText().toString());

            }
        });
    }

    public  void Guncelle(String ad, String soyad, String yas,String sehir)
    {
        SQLiteDatabase db=v1.getWritableDatabase();
        ContentValues cvGuncelle=new ContentValues();
        cvGuncelle.put("ad",ad);
        cvGuncelle.put("soyad",soyad);
        cvGuncelle.put("yas",yas);
        cvGuncelle.put("sehir",sehir);
        db.update("ogrencibilgi",cvGuncelle,"ad"+"=?",new String[]{ad});
        db.close();
    }


    private void silme(String adi)
        {
        SQLiteDatabase db=v1.getReadableDatabase();
        db.delete("ogrencibilgi","ad"+"=?",new String[]{adi});
        }

        private void kayitekle(String adi,String soyadi,String yasi,String sehri)
        {
            SQLiteDatabase db=v1.getWritableDatabase();
            ContentValues veriler=new ContentValues();
            veriler.put("ad",adi);
            veriler.put("soyad",soyadi);
            veriler.put("yas",yasi);
            veriler.put("sehir",sehri);
            db.insertOrThrow("ogrencibilgi",null,veriler);
        }
    private String[] sutunlar={"ad","soyad","yas","sehir"};
    private Cursor kayitgetir()
    {
        SQLiteDatabase db = v1.getReadableDatabase();
        Cursor okunanlar = db.query("ogrencibilgi", sutunlar, null, null, null, null, null);
        return okunanlar;
    }
    private void kayitgoster(Cursor goster)
    {
        StringBuilder builder = new StringBuilder();
        while( goster.moveToNext()) {
            String add =  goster.getString( goster.getColumnIndex("ad"));
            String soyadd =  goster.getString(( goster.getColumnIndex("soyad")));
            String sehirr=  goster.getString(( goster.getColumnIndex("sehir")));
            String yass =  goster.getString(( goster.getColumnIndex("yas")));
            builder.append("ad: ").append(add+"\n" );
            builder.append("soyad:").append(soyadd+"\n");
            builder.append("şehir: ").append(sehirr+"\n");
            builder.append("yaş: ").append(yass+"\n");
            builder.append("------------- ").append("\n");
        }
        TextView text = (TextView)findViewById(R.id.textViewbilgiler);
        text.setText(builder);
    }


    }



activity_main.xml kodları

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TableLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TableRow
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <TextView
                    android:id="@+id/textView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Ad" />

                <EditText
                    android:id="@+id/editTextad"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ems="10"
                    android:inputType="textPersonName"
                    android:hint="Name" />
            </TableRow>

            <TableRow
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <TextView
                    android:id="@+id/textView2"
                    android:layout_width="159dp"
                    android:layout_height="wrap_content"
                    android:text="Soyad" />

                <EditText
                    android:id="@+id/editTextsoyad"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ems="10"
                    android:inputType="textPersonName"
                    android:hint="Name" />
            </TableRow>

            <TableRow
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <TextView
                    android:id="@+id/textView3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Yaş" />

                <EditText
                    android:id="@+id/editTextyas"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ems="10"
                    android:inputType="textPersonName"
                    android:hint="Name" />
            </TableRow>

            <TableRow
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <TextView
                    android:id="@+id/textView4"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="şehir" />

                <EditText
                    android:id="@+id/editTextsehir"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:ems="10"
                    android:inputType="textPersonName"
                    android:hint="Name" />

            </TableRow>

            <TableRow
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <Button
                    android:id="@+id/buttonkayit"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Kayıt Ekle" />

                <Button
                    android:id="@+id/buttongoster"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="kayıtları göster" />
            </TableRow>

            <TableRow
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <Button
                    android:id="@+id/buttonsil"
                    android:layout_width="138dp"
                    android:layout_height="wrap_content"
                    android:text="Kaydı sil" />

                <Button
                    android:id="@+id/buttonguncelle"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Kaydı güncelle" />
            </TableRow>

        </TableLayout>

        <TextView
            android:id="@+id/textViewbilgiler"
            android:layout_width="match_parent"
            android:layout_height="233dp"
            android:text="TextView"
            android:scrollbars="vertical"/>

    </LinearLayout>

</android.support.constraint.ConstraintLayout>

Leave a Comment