Site icon Mobilhanem

Android SQLite Database Kullanımı (select-insert-update-delete)

Merhaba arkadaşlar bu dersimizde Android de SQLite Veritabanı kullanmayı anlatmaya çalışacağım. Hepimizin malumudir ki yapmak istediğimiz yada yaptığımız uygulamalarda bazı verileri saklama ihtiyacı duyarız.Bunun da en güzel yolu elbetteki veritabanıdır.

NOT : Dersi hazırlarken eclipse ile hazırlamıştık. Kaynak kod içinde hem eclipse projesini hemde Android Studio projesini bulabilirsiniz.
Sqlite kullanımı oldukça kolay bir veri tabanı sistemidir. Küçük boyutu ve hızlı yapısı sayesinde mobil cihazlarda kullanımı oldukça yaygındır. Sqlite birçok programlama diliyle birlikte kullanılabilir.
Bu dersimizde ActionBar kullandığım için min sdk versiyonumuzu 11(Android 3.0) seçtik.Eğer ActionBarı API 11 in altında kullanmak isterseniz Support Library indirip projemize dahil ediyoruz. ActionBar konusunu daha sonra detaylıca anlatacağım.
Şimdi sqlite veritabanına geri dönelim. Daha İyi anlamamız için küçük bir uygulama yazdım. Bu uygulamada veritabanında sqlite_database adında bir veritabanı oluşturdum.İçinde kitap_listesi adında bir tablo var. Uygulama içinden bu tabloya kitap ekleyip,kitap silebiliyor ve var olanı kitabı güncelleyebiliyoruz(update).
Şimdi uygulamanın kodlarına geçelim.Öncellikle oluşturuken api 11 muhabbetine dikkat edelim.

Arkadaşlar Kaynak Kodu İndirip uygulamayı çalıştırırsanız anlamanız çok daha kolay olucaktır.

Öncelikle Database Classı inceleyelim.

import java.util.ArrayList;
import java.util.HashMap;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class Database extends SQLiteOpenHelper {

	// Database Version
	private static final int DATABASE_VERSION = 1;

	// Database Name
	private static final String DATABASE_NAME = "sqllite_database";//database adı

	private static final String TABLE_NAME = "kitap_listesi";
	private static String KITAP_ADI = "kitap_adi";
	private static String KITAP_ID = "id";
	private static String KITAP_YAZARI = "yazar";
	private static String KITAP_BASIM_YILI = "yil";
	private static String KITAP_FIYATI = "fiyat";

	public Database(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {  // Databesi oluşturuyoruz.Bu methodu biz çağırmıyoruz. Databese de obje oluşturduğumuzda otamatik çağırılıyor.
		String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "("
				+ KITAP_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
				+ KITAP_ADI + " TEXT,"
				+ KITAP_YAZARI + " TEXT,"
				+ KITAP_BASIM_YILI + " TEXT,"
				+ KITAP_FIYATI + " TEXT" + ")";
		db.execSQL(CREATE_TABLE);
	}

	public void kitapSil(int id){ //id si belli olan row u silmek için

		 SQLiteDatabase db = this.getWritableDatabase();
		 db.delete(TABLE_NAME, KITAP_ID + " = ?",
		            new String[] { String.valueOf(id) });
		 db.close();
	}

	public void kitapEkle(String kitap_adi, String kitap_yazari,String kitap_basim_yili,String kitap_fiyat) {
		//kitapEkle methodu ise adı üstünde Databese veri eklemek için
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put(KITAP_ADI, kitap_adi);
		values.put(KITAP_YAZARI, kitap_yazari);
		values.put(KITAP_BASIM_YILI, kitap_basim_yili);
		values.put(KITAP_FIYATI, kitap_fiyat);

		db.insert(TABLE_NAME, null, values);
		db.close(); //Database Bağlantısını kapattık*/
	}

	public HashMap<String, String> kitapDetay(int id){
		//Databeseden id si belli olan row u çekmek için.
                //Bu methodda sadece tek row değerleri alınır.
		//HashMap bir çift boyutlu arraydir.anahtar-değer ikililerini bir arada tutmak için tasarlanmıştır.
		//map.put("x","300"); mesala burda anahtar x değeri 300.

		HashMap<String,String> kitap = new HashMap<String,String>();
		String selectQuery = "SELECT * FROM " + TABLE_NAME+ " WHERE id="+id;

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        // Move to first row
        cursor.moveToFirst();
        if(cursor.getCount() > 0){
        	kitap.put(KITAP_ADI, cursor.getString(1));
        	kitap.put(KITAP_YAZARI, cursor.getString(2));
        	kitap.put(KITAP_BASIM_YILI, cursor.getString(3));
        	kitap.put(KITAP_FIYATI, cursor.getString(4));
        }
        cursor.close();
        db.close();
		// return kitap
		return kitap;
	}

	public  ArrayList<HashMap<String, String>> kitaplar(){

		//Bu methodda ise tablodaki tüm değerleri alıyoruz
		//ArrayList adı üstünde Array lerin listelendiği bir Array.Burda hashmapleri listeleyeceğiz
		//Herbir satırı değer ve value ile hashmap a atıyoruz. Her bir satır 1 tane hashmap arrayı demek.
		//olusturdugumuz tüm hashmapleri ArrayList e atıp geri dönüyoruz(return).

		SQLiteDatabase db = this.getReadableDatabase();
		String selectQuery = "SELECT * FROM " + TABLE_NAME;
		Cursor cursor = db.rawQuery(selectQuery, null);
	    ArrayList<HashMap<String, String>> kitaplist = new ArrayList<HashMap<String, String>>();
	    // looping through all rows and adding to list

	    if (cursor.moveToFirst()) {
	        do {
	            HashMap<String, String> map = new HashMap<String, String>();
	            for(int i=0; i<cursor.getColumnCount();i++)
	            {
	                map.put(cursor.getColumnName(i), cursor.getString(i));
	            }

	            kitaplist.add(map);
	        } while (cursor.moveToNext());
	    }
	    db.close();
	    // return kitap liste
	    return kitaplist;
	}

	public void kitapDuzenle(String kitap_adi, String kitap_yazari,String kitap_basim_yili,String kitap_fiyat,int id) {
	    SQLiteDatabase db = this.getWritableDatabase();
	    //Bu methodda ise var olan veriyi güncelliyoruz(update)
	    ContentValues values = new ContentValues();
	    values.put(KITAP_ADI, kitap_adi);
		values.put(KITAP_YAZARI, kitap_yazari);
		values.put(KITAP_BASIM_YILI, kitap_basim_yili);
		values.put(KITAP_FIYATI, kitap_fiyat);

	    // updating row
	    db.update(TABLE_NAME, values, KITAP_ID + " = ?",
	            new String[] { String.valueOf(id) });
	}

	public int getRowCount() {
		// Bu method bu uygulamada kullanılmıyor ama her zaman lazım olabilir.Tablodaki row sayısını geri döner.
		//Login uygulamasında kullanacağız
		String countQuery = "SELECT  * FROM " + TABLE_NAME;
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery(countQuery, null);
		int rowCount = cursor.getCount();
		db.close();
		cursor.close();
		// return row count
		return rowCount;
	}

	public void resetTables(){
		//Bunuda uygulamada kullanmıyoruz. Tüm verileri siler. tabloyu resetler.
		SQLiteDatabase db = this.getWritableDatabase();
		// Delete All Rows
		db.delete(TABLE_NAME, null, null);
		db.close();
	}

	@Override
	public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
		// TODO Auto-generated method stub

	}

}

Şimdide MainActivity Classı inceleyelim ve Database classdaki metodları nasıl kullandığımıza bakalım.

import java.util.ArrayList;
import java.util.HashMap;
import com.mobilhanem.sqlliteexample.R;
import android.os.Bundle;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {

	ListView lv;
	ArrayAdapter adapter;
	ArrayList<HashMap<String, String>> kitap_liste;
	String kitap_adlari[];
	int kitap_idler[];
	protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

        ActionBar actionBar = getActionBar();
	    actionBar.setDisplayHomeAsUpEnabled(false);
	}

	public void onResume()
    {   //neden onResume metodu kullandığımı ders içinde anlattım.
    super.onResume();
    Database db = new Database(getApplicationContext()); // Db bağlantısı oluşturuyoruz. İlk seferde database oluşturulur.
    kitap_liste = db.kitaplar();//kitap listesini alıyoruz
    if(kitap_liste.size()==0){//kitap listesi boşsa
   	 Toast.makeText(getApplicationContext(), "Henüz Kitap Eklenmemiş.\nYukarıdaki + Butonundan Ekleyiniz", Toast.LENGTH_LONG).show();
    }else{
	     kitap_adlari = new String[kitap_liste.size()]; // kitap adlarını tutucamız string arrayi olusturduk.
	     kitap_idler = new int[kitap_liste.size()]; // kitap id lerini tutucamız string arrayi olusturduk.
	     for(int i=0;i<kitap_liste.size();i++){
	    	 kitap_adlari[i] = kitap_liste.get(i).get("kitap_adi");
	    	 //kitap_liste.get(0) bize arraylist içindeki ilk hashmap arrayini döner. Yani tablomuzdaki ilk satır değerlerini
	    	 //kitap_liste.get(0).get("kitap_adi") //bize arraylist içindeki ilk hashmap arrayin anahtarı kitap_adi olan value döner

	    	 kitap_idler[i] = Integer.parseInt(kitap_liste.get(i).get("id"));
	    	//Yukarıdaki ile aynı tek farkı değerleri integer a çevirdik.
	     }
	     //Kitapları Listeliyoruz ve bu listeye listener atıyoruz
	     lv = (ListView) findViewById(R.id.list_view);

	     adapter = new ArrayAdapter(this, R.layout.list_item, R.id.kitap_adi, kitap_adlari);
	     lv.setAdapter(adapter);

	     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
	 		public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
	 				long arg3) {
	 			//Listedeki her hangibir yere tıklandıgında tıklanan satırın sırasını alıyoruz.
	 			//Bu sıra id arraydeki sırayla aynı oldugundan tıklanan satırda bulunan kitapın id sini alıyor ve kitap detaya gönderiyoruz.
	 			 Intent intent = new Intent(getApplicationContext(), KitapDetay.class);
	 			 intent.putExtra("id", (int)kitap_idler[arg2]);
	             startActivity(intent);

	 		}
	     });
    }

    }

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);

		return super.onCreateOptionsMenu(menu);
	}
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
	    // Handle presses on the action bar items
	    switch (item.getItemId()) {
	        case R.id.ekle:
	        	KitapEkle();
	            return true;
	        default:
	            return super.onOptionsItemSelected(item);
	    }
	}

	 private void KitapEkle() {
	        Intent i = new Intent(MainActivity.this, KitapEkle.class);
	        startActivity(i);
	    }
}

Arkadaşlar gerekli açıklamaları zaten kod üzerinde yaptım. Diğer KitapEkle ve KitapDuzenle classını kaynak kodu indirerek inceleyebilirsiniz. Bu class lardaki gerekli açıklamalarıda kod üzerinnde yaptım.

Burada üzerinde duracağım nokta MainActivity de neden işlemleri onCreate() methodunda yapmadım da onResume() methodunda yaptığım. Arkadaşlar bu durumu şöyle açıklayayım. Elimizde A ve B activity leri var. A activity sinden B activity sine geçiş yaptığımızda eğer A activtysini finish() methodu ile öldürmediysek B activitysinden Back butonu veya ActionBar dan geri gel butonuyla geri geldiğimizde A activty si olduğu gibi durur ve yeniden yaratılmaz. Ama bizim bu uygulamamızda Kitap Listesindeki kitapları silebilir veya değiştirebiliriz. Örneğin uygulamayı ilk actık kitapları listeledik ve KitapDetay classından kitabı sildik.Ama geri MainActivity e geldiğimizde baştan yüklenmiyeceği için kitap duruyor gözükecektir. İşte burda onResume() methodu bizim işimize yarıyor. Bu method bulunduğu class her açıldığında çalışır. İster ilk açılıyor olsun isterse Back butonuyla geri gelinmiş olsun her zaman çalışır.
Evet arkadaşlar bu derste anlatmak istediklerim bu kadar.Oluşturduğumuz bu database verilerini ,yapısını,yada doğru oluşturup oluşturmadığımızı kontrol etmek için bu dersimize göz atınız.Paylaştığım bu derslerin benzerlerinide İos platformu için de yine örnek uygulamalarla anlatmaya çalışacağım. Bir dahaki dersimizde Android de Splash Secreen(Açılış Sayfası) yapımını anlatacağım.Arkadaşlar bu dersle ilgili aklınıza takılan yada anlamadığınız yerleri sorabilirsiniz. Müsait olduğum zamanlar cevaplamaya çalışacağım. O zamana kadar kendinize iyi bakın ve destek için bu dersleri aşağıdaki linklerden paylaşın.

Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.

24
Exit mobile version