How To Use SQLite Database in Android


databasee3SQLite Database ten kısaca bahsetmek gerekirse kullanımı basit, çok yer kaplamayan ve mobil cihazlarda rahatlıkta kullanılabilen açık kaynak kodlu ve sistem bağımsız bir veritabanı kütüphanesidir. Sistem bağımsız derken onlarca programlama dili ile de kullanılabilir. Az yer kaplar ve istenilen hızda veri işlemleri yapabilir. Bu yüzden çok tercih edilir. Şimdi bu yazı hakkında biraz bahsetmek gerekirse, CRUD* işlemlerini gerçekleştiren bir class yazacağız. Oluşturduğumuz bu class da her ne zaman isterseniz kullanılabilir bir biçimde olacak.
*CRUD : CREATE – READ – UPDATE – DELETE

Öncelikle tablo yapısından bahsedecek olursak, kisiler tablosu olacak, ve ilgili alanlar da “id, ad, soyad, telefon” şeklinde oluşturulacak. Veritabanı yapısından da bileceğimiz gibi, id primary key olacak türkçe kaynak için tıklayın). ad, soyad ve telefon alanları da TEXT formatında olacak. Daha açıklayıcı gösterecek olursak:
tableStructer

Yapmak istediğimiz basit şablon şu şekilde olacak.
screen9-2

Öncelikle main.xml dosyamızı açalım (res/layout/main.xml) ve aşağıdaki gibi değiştirelim.

<?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" >

	<EditText
	    android:id="@+id/editText_Ad"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:ems="10"
	    android:hint="Adınız..." >

		<requestFocus />
	</EditText>

	<EditText
	    android:id="@+id/editText_Soyad"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:ems="10"
	    android:hint="Soyadınız..." />

	<EditText
	    android:id="@+id/editText_Telefon"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:ems="10"
	    android:hint="Telefon numaranız..."
	    android:inputType="phone" />

	<Button
	    android:id="@+id/button_Kaydet"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="KAYIT EKLE"
	    android:textSize="16sp" />
	
	<Button
	    android:id="@+id/button_Goster"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="KAYIT GÖSTER"
	    android:textSize="16sp" />

	<ScrollView
	    android:id="@+id/scrollView1"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content" >
	</ScrollView>

	<ScrollView
	    android:id="@+id/scrollView2"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content" >

	    <LinearLayout
	        android:layout_width="match_parent"
	        android:layout_height="match_parent"
	        android:layout_gravity="center_horizontal"
	        android:orientation="horizontal" >

	        <TextView
	            android:id="@+id/textViewAdGoster"
	            android:layout_width="100dp"
	            android:layout_height="wrap_content"
	            android:gravity="center_horizontal"
	            android:text="AD" />

	        <TextView
	            android:id="@+id/textViewSoyadGoster"
	            android:layout_width="100dp"
	            android:layout_height="wrap_content"
	            android:gravity="center_horizontal"
	            android:text="SOYAD" />

	        <TextView
	            android:id="@+id/textViewTelefonGoster"
	            android:layout_width="100dp"
	            android:layout_height="wrap_content"
	            android:gravity="center_horizontal"
	            android:text="TELEFON" />	        	        	        
	    </LinearLayout>
	</ScrollView>

</LinearLayout>

Şimdi Kişiler class ını yazaya başlayabiliriz. Yeni bir class oluşturalım ve adı da “Kisiler.java” olsun.

package paketAdi;

public class Kisiler {

	// Private değişkenler
	int _id;
	String _ad;
	String _soyad;
	String _telefon;

	// Varsayılan Yapılandırıcı Metod
	public Kisiler(){

	}
	// Yapılandırıcı Metod
	public Kisiler(int id, String ad, String soyad, String telefon){
		this._id = id;
		this._ad = ad;
		this._soyad = soyad;
		this._telefon = telefon;
	}

	// Yapılandırıcı Metod
	public Kisiler(String ad, String soyad, String telefon){
		this._ad = ad;
		this._soyad = soyad;
		this._telefon = telefon;
	}

	// ID yi belirle.
	public void setID(int id){
		this._id = id;
	}
	// ID yi getir.
	public int getID(){
		return this._id;
	}

	// Adı belirle.
	public void setAd(String ad){
		this._ad = ad;
	}
	// Adı getir.
	public String getAd(){
		return this._ad;
	}

	// Soyadı belirle.
	public void setSoyad(String soyad){
		this._soyad = soyad;
	}
	// Soyadı getir.
	public String getSoyad(){
		return this._soyad;
	}

	// Telefon numarısını belirle.
	public void setTelefon(String telefon){
		this._telefon = telefon;
	}
	// Telefon numarasını getir.
	public String getTelefon(){
		return this._telefon;
	}

}

Kaydedilecek kişilerin bilgileri için gerekli set ve get metodlarını içeren bir class yazdık. Şimdi ise CRUD işlemleri için gerekli olan DatabaseHandler class ını yazacağız. Tabi ki bu class ımızı SQLiteOpenHelper dan extends etmeliyiz.

public class DatabaseHandler extends SQLiteOpenHelper { . . . }

Daha sonra 2 metodu override etmeliyiz. Bu metodlar onCreate() ve onUpdate().

	// Database Oluşturma işlemi.
	@Override
	public void onCreate(SQLiteDatabase db) { . . . }

	// Database Yükseltme işlemi.
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { . . . }

Ayrıca burada database versiyon numarası, database adı, tablo adı ve ilgili kolon adlarını da tanımlayacağız.
Şimdi bu haliyle(CRUD işlemleri olmadan) DatabaseHandler.java yı görelim.

package paketAdi;

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

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

public class DatabaseHandler extends SQLiteOpenHelper {

	// Tüm Static değişkenler
	// Database Versiyonu
	private static final int DATABASE_VERSION = 1;

	// Database Adı
	private static final String DATABASE_NAME = "dbKisiler";

	// Kisiler Tablosunun Adı
	private static final String TABLE_KISILER = "kisiler";

	// Kisiler Tablosunun Kolon Adları
	private static final String KEY_ID = "id";
	private static final String KEY_NAME = "ad";
	private static final String KEY_SURNAME = "soyad";
	private static final String KEY_PHONE_NUMBER = "telefon";

	// Yapılandırıcı metod
	public DatabaseHandler(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	// Database Oluşturma işlemi.
	@Override
	public void onCreate(SQLiteDatabase db) {
		String CREATE_KISILER_TABLE = "CREATE TABLE " + TABLE_KISILER + "("
				+ KEY_ID + " INTEGER PRIMARY KEY,"
				+ KEY_NAME + " TEXT,"
				+ KEY_SURNAME + " TEXT,"
				+ KEY_PHONE_NUMBER + " TEXT" + ")";
		db.execSQL(CREATE_KISILER_TABLE);
	}

	// Database Yükseltme işlemi.
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// Varsa şayet eski tabloyu sil.
		db.execSQL("DROP TABLE IF EXISTS " + TABLE_KISILER);

		// Tekrar tablo oluştur.
		onCreate(db);
	}

}

Artık CRUD işlemlerine geldik. Sırasıyla Insert, Read, Update, Delete işlemlerini yazacağız.
Insert, yani kayıt eklemek için gerekli metod: addKisiler()

	// Yeni Kayıt Eklemek.
	void addKisiler(Kisiler kisiler) {
		SQLiteDatabase db = this.getWritableDatabase();

		ContentValues values = new ContentValues();
		values.put(KEY_NAME, kisiler.getAd()); // Kisi Adı Ekle
		values.put(KEY_SURNAME, kisiler.getSoyad()); // Kisi Soyadı Ekle
		values.put(KEY_PHONE_NUMBER, kisiler.getTelefon()); // Kisi Telefonu Ekle

		// Ekleme işlemi...
		db.insert(TABLE_KISILER, null, values);
		db.close(); // Açık olan database i kapat.
	}

Read, yani kayıt getirmek, okumak için gerekli metod: getKisiler()
*Bu metod istenilen id ye göre ilgili kaydı getirir.

	// İstenilen Kaydı Getirmek.
	Kisiler getKisiler(int id) {
		SQLiteDatabase db = this.getReadableDatabase();

		Cursor cursor = db.query(TABLE_KISILER, new String[] { KEY_ID,
				KEY_NAME, KEY_SURNAME, KEY_PHONE_NUMBER }, KEY_ID + "=?",
				new String[] { String.valueOf(id) }, null, null, null, null);
		if (cursor != null)
			cursor.moveToFirst();

		Kisiler Kisiler = new Kisiler(Integer.parseInt(cursor.getString(0)),
				cursor.getString(1), cursor.getString(2), cursor.getString(3));
		// return Kisiler
		return Kisiler;
	}

Tüm Kayıtların getirilmesi için ise getAllKisiler() metodunu kullanacağız. Burada da bir List kullanacağız. Bir döngü oluşturup her defasında List in içine sıradaki kaydı ekleyeceğiz ve istediğimiz zaman da tüm kaydı gösterebileceğiz.

	// Tüm Kaydı Getirmek.
	public List<Kisiler> getAllKisiler() {
		List<Kisiler> KisilerList = new ArrayList<Kisiler>();
		// Tüm Kisiler Tablosunu Getir.
		String selectQuery = "SELECT * FROM " + TABLE_KISILER;

		SQLiteDatabase db = this.getWritableDatabase();
		Cursor cursor = db.rawQuery(selectQuery, null);

		// Döngü Oluşturmak ve Sırasyıla Eklemek.
		if (cursor.moveToFirst()) {
			do {
				Kisiler Kisiler = new Kisiler();
				Kisiler.setID(Integer.parseInt(cursor.getString(0)));
				Kisiler.setAd(cursor.getString(1));
				Kisiler.setSoyad(cursor.getString(2));
				Kisiler.setTelefon(cursor.getString(3));
				// Kişileri listeye eklemek.
				KisilerList.add(Kisiler);
			} while (cursor.moveToNext());
		}

		// return KisilerList
		return KisilerList;
	}

Update, yani ilgili kaydın değerini güncellemek, güncellemek için gerekli metod: updateKisiler()

	// Kisiler Tablosunu Güncellemek(Update)
	public int updateKisiler(Kisiler Kisiler) {
		SQLiteDatabase db = this.getWritableDatabase();

		ContentValues values = new ContentValues();
		values.put(KEY_NAME, Kisiler.getAd());
		values.put(KEY_SURNAME, Kisiler.getSoyad());
		values.put(KEY_PHONE_NUMBER, Kisiler.getTelefon());

		// update işlemini gerçekleştir.
		return db.update(TABLE_KISILER, values, KEY_ID + " = ?",
				new String[] { String.valueOf(Kisiler.getID()) });
	}

Delete, yani ilgili kaydın değerinin silinmesi, silmek için gerekli metod: deleteKisiler()

	// Kisiler Tablosundan Tek Kayıt Silmek(Delete)
	public void deleteKisiler(Kisiler Kisiler) {
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(TABLE_KISILER, KEY_ID + " = ?",
				new String[] { String.valueOf(Kisiler.getID()) });
		db.close();
	}

Ayrıca Kisiler tablosunun kayıt sayısını getirmek için de bu metodu kullanacağız:

	// Kisiler Tablosunun Kayıt Sayısı
	public int getKisilersCount() {
		String countQuery = "SELECT  * FROM " + TABLE_KISILER;
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery(countQuery, null);
		cursor.close();

		// return count
		return cursor.getCount();
	}

Tam olarak DatabaseHandler.java :

package paketAdi;

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

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

public class DatabaseHandler extends SQLiteOpenHelper {

	// Tüm Static değişkenler
	// Database Versiyonu
	private static final int DATABASE_VERSION = 1;

	// Database Adı
	private static final String DATABASE_NAME = "dbKisiler";

	// Kisiler Tablosunun Adı
	private static final String TABLE_KISILER = "kisiler";

	// Kisiler Tablosunun Kolon Adları
	private static final String KEY_ID = "id";
	private static final String KEY_NAME = "ad";
	private static final String KEY_SURNAME = "soyad";
	private static final String KEY_PHONE_NUMBER = "telefon";

	// Yapılandırıcı metod
	public DatabaseHandler(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	// Database Oluşturma işlemi.
	@Override
	public void onCreate(SQLiteDatabase db) {
		String CREATE_KISILER_TABLE = "CREATE TABLE " + TABLE_KISILER + "("
				+ KEY_ID + " INTEGER PRIMARY KEY,"
				+ KEY_NAME + " TEXT,"
				+ KEY_SURNAME + " TEXT,"
				+ KEY_PHONE_NUMBER + " TEXT" + ")";
		db.execSQL(CREATE_KISILER_TABLE);
	}

	// Database Yükseltme işlemi.
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// Drop older table if existed
		db.execSQL("DROP TABLE IF EXISTS " + TABLE_KISILER);

		// Create tables again
		onCreate(db);
	}

	/**
	 * Tüm CRUD(Create, Read, Update, Delete) işlemleri
	 */

	// Yeni Kayıt Eklemek.
	void addKisiler(Kisiler kisiler) {
		SQLiteDatabase db = this.getWritableDatabase();

		ContentValues values = new ContentValues();
		values.put(KEY_NAME, kisiler.getAd()); // Kisi Adı Getir
		values.put(KEY_SURNAME, kisiler.getSoyad()); // Kisi Soyadı Getir
		values.put(KEY_PHONE_NUMBER, kisiler.getTelefon()); // Kisi Telefonu Getir

		// Ekleme işlemi...
		db.insert(TABLE_KISILER, null, values);
		db.close(); // Açık olan database i kapat.
	}

	// İstenilen Kaydı Getirmek.
	Kisiler getKisiler(int id) {
		SQLiteDatabase db = this.getReadableDatabase();

		Cursor cursor = db.query(TABLE_KISILER, new String[] { KEY_ID,
				KEY_NAME, KEY_SURNAME, KEY_PHONE_NUMBER }, KEY_ID + "=?",
				new String[] { String.valueOf(id) }, null, null, null, null);
		if (cursor != null)
			cursor.moveToFirst();

		Kisiler Kisiler = new Kisiler(Integer.parseInt(cursor.getString(0)),
				cursor.getString(1), cursor.getString(2), cursor.getString(3));
		// return Kisiler
		return Kisiler;
	}

	// Tüm Kaydı Getirmek.
	public List<Kisiler> getAllKisiler() {
		List<Kisiler> KisilerList = new ArrayList<Kisiler>();
		// Tüm Kisiler Tablosunu Getir.
		String selectQuery = "SELECT * FROM " + TABLE_KISILER;

		SQLiteDatabase db = this.getWritableDatabase();
		Cursor cursor = db.rawQuery(selectQuery, null);

		// Döngü Oluşturmak ve Sırasyıla Eklemek.
		if (cursor.moveToFirst()) {
			do {
				Kisiler Kisiler = new Kisiler();
				Kisiler.setID(Integer.parseInt(cursor.getString(0)));
				Kisiler.setAd(cursor.getString(1));
				Kisiler.setSoyad(cursor.getString(2));
				Kisiler.setTelefon(cursor.getString(3));
				// Kişileri listeye eklemek.
				KisilerList.add(Kisiler);
			} while (cursor.moveToNext());
		}

		// return KisilerList
		return KisilerList;
	}

	// Kisiler Tablosunu Güncellemek(Update)
	public int updateKisiler(Kisiler Kisiler) {
		SQLiteDatabase db = this.getWritableDatabase();

		ContentValues values = new ContentValues();
		values.put(KEY_NAME, Kisiler.getAd());
		values.put(KEY_SURNAME, Kisiler.getSoyad());
		values.put(KEY_PHONE_NUMBER, Kisiler.getTelefon());

		// updating row
		return db.update(TABLE_KISILER, values, KEY_ID + " = ?",
				new String[] { String.valueOf(Kisiler.getID()) });
	}

	// Kisiler Tablosundan Tek Kayıt Silmek(Delete)
	public void deleteKisiler(Kisiler Kisiler) {
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(TABLE_KISILER, KEY_ID + " = ?",
				new String[] { String.valueOf(Kisiler.getID()) });
		db.close();
	}

	// Kisiler Tablosunun Kayıt Sayısı
	public int getKisilersCount() {
		String countQuery = "SELECT  * FROM " + TABLE_KISILER;
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery(countQuery, null);
		cursor.close();

		// return count
		return cursor.getCount();
	}
}

Şimdi bu class ı nasıl kullanabiliriz ona bakalım. Main activity class ımızı açıyoruz. Bendeki adı “AndroidSQLiteTutorialActivity.java”
(src/paketAdi/AndroidSQLiteTutorialActivity.java)

package paketAdi;

import java.util.List;

import android.app.Activity;
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;
import android.widget.ListView;
import android.widget.TextView;

public class AndroidSQLiteTutorialActivity extends Activity {
	
	private EditText _editTextAd, _editTextSoyad, _editTextTelefon;
	private Button _buttonKaydet, _buttonKayitGetir;
	private TextView _textAdGoster, _textSoyadGoster, _textTelefonGoster;
	private OnClickListener _buttonKaydetListener, _buttonKayitGetirListener;
	
	private DatabaseHandler _db;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
    	setContentView(R.layout.main);

        _db = new DatabaseHandler(this);

        setObjectsFromXML();

        // Kaydet butonu için onClickListener tanımlıyoruz.
        _buttonKaydetListener = new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				// Aşağıda tanımlanan metodu çağırıyoruz.
				yeniKisiEkle();
			}
        };
        // Tanımladığımız onClickListener i kaydet butonuna set ediyoruz.
		_buttonKaydet.setOnClickListener(_buttonKaydetListener);

        // Kayıt getir butonu için onClickListener tanımlıyoruz.
		_buttonKayitGetirListener = new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				// Aşağıda tanımlanan metodu çağırıyoruz.
				kayitlariGetir();
			}
        };
        // Tanımladığımız onClickListener i kayit getir butonuna set ediyoruz.
		_buttonKayitGetir.setOnClickListener(_buttonKayitGetirListener);

	}

	/**
     * XML de bulunan tüm objeleri tanımlıyoruz.
     * (onCreate metodunun içinde çok karışık olmaması 
     * için bir metodun içine aldık)
     **/
	public void setObjectsFromXML(){
		_editTextAd = (EditText) findViewById(R.id.editText_Ad);
		_editTextSoyad = (EditText) findViewById(R.id.editText_Soyad);
		_editTextTelefon = (EditText) findViewById(R.id.editText_Telefon);
		_buttonKaydet = (Button) findViewById(R.id.button_Kaydet);
		_buttonKayitGetir = (Button) findViewById(R.id.button_Goster);
		_textAdGoster = (TextView) findViewById(R.id.textViewAdGoster);
		_textSoyadGoster = (TextView) findViewById(R.id.textViewSoyadGoster);
		_textTelefonGoster = (TextView) findViewById(R.id.textViewTelefonGoster);
	}

	/**
     * Yeni Kişi Eklemek.
     **/
	public void yeniKisiEkle(){
		_db.addKisiler(new Kisiler(_editTextAd.getText().toString(), _editTextSoyad.getText().toString(), _editTextTelefon.getText().toString()));
	}

	/**
     * Tüm Kayıtları Getirmek.
     **/
	public void kayitlariGetir(){
		_textAdGoster.setText("AD");
		_textSoyadGoster.setText("SOYAD");
		_textTelefonGoster.setText("TELEFON");

		List<Kisiler> kisiler = _db.getAllKisiler();
		for (Kisiler k : kisiler) {
			_textAdGoster.setText(_textAdGoster.getText().toString() + "\n" + k.getAd());
			_textSoyadGoster.setText(_textSoyadGoster.getText().toString() + "\n" + k.getSoyad());
			_textTelefonGoster.setText(_textTelefonGoster.getText().toString() + "\n" + k.getTelefon());
			
		}
	}
}

Son olarak aşağıdaki gibi fazla kayıt eklersek scrollview in özelliğinden dolayı kayıtları kaydırarak görebiliriz.

screen9-3

NOT: Burada güncelleme(update), silme(delete) işlemleri kullanmadık. Burada bir Spinner kullanıp kayıtlı kişilerin adlarını getirebilir ve ilgili kaydın üzerinde güncelleme(update) ve silme(delete) işlemlerini gerçekleştirebiliriz. Zaten gerekli metodlar DatabaseHandler.java içerisinde mevcut, yapılması gereken sadece main activity class ı içerisinde bie metoda bağlamak. Kolay gelsin 🙂

Reklamlar

06 Oca 2013 tarihinde Android içinde yayınlandı ve , , , olarak etiketlendi. Kalıcı bağlantıyı yer imlerinize ekleyin. 3 Yorum.

  1. Merhabalar ,
    Öncelikle uygulamanız gerçekten çok faydalı oldukça işime yaradı teşekkürler.
    Benim yapmak istediğim uygulamada database içerisinde 10 ‘dan fazla birbirleriyle ilişkili tablo var.Bu tabloların hepsini DatabaseHandler gibi bir class içinde create edip bunlara ait CRUD işlemlerini de yine burada yapmak doğru bir yaklaşım mıdır ? Önerebileceğiniz başka bir yol var mı ?

  2. Update ve Delete işlemlerinde Spinner i id ile mi doldurup sileceğiz?

  3. Not kısmında adları getirerek silme ve güncelleme yapabilirsiniz demişsiniz ancak DatabaseHandler.java dosyasında güncelleme yaparken yada silme yaparken id’i istiyor. Hata aldım yardımcı olur musunuz?

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: