Anasayfa » Android, Java ve Java Teknolojileri

Android Programlama – Veritabanı, SQLiteOpenHelper, Cursor

22 Temmuz 2012 11.699 kez okundu 6 yorum
1 Star2 Stars3 Stars4 Stars5 Stars (2 oy,5 üzerinden : 3,00 )
Loading...

Merhaba arkadaşlar,bugünkü çalışmamızda, hazırlamış olduğumuz uygulamamızı formverilerini database de tutmak için geliştireceğiz.  Bir önceki yazımızı okumayanlar buradan okuyabilir.  Okumak istemeyenler bir önceki uygulamayı indirip üzerinde devam edebilirler.

Diğer yazılarımız;

Database kullanımına geçtiğimizde, daha önce kullandığımız arrayAdapter yerine artık cursorAdapter kullanacağız.

İlk olarak database bağlantı ve işlemlerini gerçekleştireceğimiz sınıfı yazmalıyız. Bunun için src klasörü altında diğer sınıflarımızın yanında BookHelper.java adında bir dosya açalım. Açtığımız bu sınıfımız  SQLiteOpenHelper classını extend edecek ve şu şekilde tanımlayalım.

package kodmerkezi.net.basitForm;
 
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
 
public class BookHelper extends SQLiteOpenHelper {
 
	//database ismimiz
	private static final String DATABASE_NAME="lunchlist.db";
 
	//database de bir değişiklik olması durumunda buradan versiyon değiştireceğiz.
	private static final int SCHEMA_VERSION=1;
 
	public BookHelper(Context context) {
		super(context, DATABASE_NAME, null, SCHEMA_VERSION);
	}
 
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
 
	}
 
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
 
	}
 
 
}

Bu şekilde hazırlanan database classı ile compile edilebilir olması gerekir.  Database ismi “list.db” dir ve versiyonu 1 dir. Versiyon şimdilik bizi çok ilgilendirmiyor. Bundan sonraki adım olarak, tablolarımızı belirlemek ve yaratmak için onCreate() metodunu kullanmak.

@Override
	public void onCreate(SQLiteDatabase db) {
		//tablomuz ilk kez yaratılırken kullanılacak.
		db.execSQL("CREATE TABLE books (_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT, author TEXT, type TEXT, comment TEXT);");
	}

onCreate() metodu ile tablomuz ilk kez yaratılırken çalıştırılacak sql komutunu yazıyorum. onUpgrade() ise birden fazla tablo versiyonu var ise kullanılacak ve şimdilik onunla işimiz yok.

Yazımızın ilerleyen kısımlarında yavaş yavaş kodumuzdaki fazlalıkları atacağız. Çünkü artık kod karışmaya başladı.

İlk olarak yeni classımızdan bir nesne tanımlayalım.

/**
	  * Database bağlantımız
	  */
	 BookHelper helper;

ardından onCreate() içinde yeni bir nesne yaratalım.

 /**
         * Database bağlantımızı açıyoruz
         */
        helper = new BookHelper(this);

ve son olarak onDestroy() metodu ekleyerek database i kapatalım.

@Override
	protected void onDestroy() {
		super.onDestroy();
		//database bağlantımız kapatıyoruz.
		helper.close();
	}

Şu aşama ise artık Book model dosyamız yerine database kullanacağız. ArrayAdapter yerine ise Cursor kullanacağız.

BookHelper classımıza aşağıdaki insert() fonksiyonunu ekliyoruz.

	/**
	 * Database insert işlemini gerçekleştiren fonksiyon
	 * 
	 * @param name
	 * @param author
	 * @param type
	 * @param comment
	 */
	public void insert(String name, String author,String type, String comment) {
 
			ContentValues cv=new ContentValues();
			cv.put("name", name);
			cv.put("author", author);
			cv.put("type", type);
			cv.put("comment", comment);
			getWritableDatabase().insert("books", "name", cv);
	}

getWritableDatabase() ile database i çağırıyoruz.Eğer bağlantı açık değil ise otomatik olarak bağlantı açılıyor.

onSave metodunda değişiklik yapalım. Butona tıklandığında kayıt işlemi yapılsın.

 /**
     * Formumuzda yeni kitap kaydında çalışıyor
     */
    private View.OnClickListener onSave = new View.OnClickListener() {
 
		public void onClick(View v) {
			String type = null;
 
			/**
			 * aldığımız seçenği switch ile ilgili şekilde kaydediyoruz.
			 */
			switch (types.getCheckedRadioButtonId()) {
			case R.id.adventure:
				type="adventure";
				break;
			case R.id.biography:
				type = "biography";
				break;
			case R.id.documentary:
				type = "documentary";
				break;
			}
 
			helper.insert(name.getText().toString(), author.getText().toString(), type, comment.getText().toString());
		}
 
	};

Ekleme işlemi tamamdır, gelin şimdide bu  eklediğimiz kitapların listesini çekelim. Bunun için BookHelper dosyasına getAll() isminde Cursor dondüren bir metod yazalım.

	/**
	 * Bütün listeyi döndürüyor
	 * @return
	 */
	public Cursor getAll() {
		return(getReadableDatabase().rawQuery("SELECT _id, name, author, type, comment FROM books ORDER BY name",	null));
 
	}

Bu yazdığımız metod tüm bilgiyi çekiyor. Biz sadece özel bir kolonu almak istersek(örneğin kitap isimleri)  diye bir kaç metod daha ekleyelim.

/**
	 * Tüm listeyi almak yerine özel alanları almak için
	 * @param c
	 * @return
	 */
	public String getName(Cursor c) {
		return(c.getString(1));
	}
	public String getAuthor(Cursor c) {
		return(c.getString(2));
	}
	public String getType(Cursor c) {
		return(c.getString(3));
	}
	public String getComment(Cursor c) {
		return(c.getString(4));
	}

Listeyi database den çekme işlemi de tamam olduğuna göre sıra gelir bunları işlemeye. Şimdi elimizde var olan bir BookAdapter imiz ArrayAdapterden extend ediyor. Ancak bir Cursor kullanacağımız için burada bir revizyona gidiyoruz.  Bu arada artık getView kullanamayacağız. Bunun yerine bindView ile newView kullanacağız.

	/**
	 * Kitaplarımızı liste halinde listViewda görünmesini sağlayan adapter
	 */
	public class BookAdapter extends CursorAdapter {
 
		public BookAdapter(Cursor c) {
			super(BasitFormActivity.this,c);
		}
 
		@Override
		public void bindView(View row, Context ctxt, Cursor c) {
			BookHolder holder=(BookHolder)row.getTag();
			holder.populateFrom(c, helper);
		}
		@Override
		public View newView(Context ctxt, Cursor c,	ViewGroup parent) {
				LayoutInflater inflater=getLayoutInflater();
				View row=inflater.inflate(R.layout.satir, parent, false);
				BookHolder holder=new BookHolder(row);
				row.setTag(holder);
				return(row);
		}
 
	}

onCreate metodu içine şu kodu ekliyoruz

model=helper.getAll();
startManagingCursor(model);
adapter=new RestaurantAdapter(model);
list.setAdapter(adapter);

BookHolder classımızı şu şekilde düzenleyelim

/**
	 * Kitaplarımızı tutan yapı
	 */
	static class BookHolder {
		private TextView name=null;
		private TextView author=null;
		private ImageView icon=null;
		BookHolder(View row) {
			name=(TextView)row.findViewById(R.id.name);
			author=(TextView)row.findViewById(R.id.author);
			icon=(ImageView)row.findViewById(R.id.icon);
		}
		void populateFrom(Cursor c, BookHelper helper) {
			name.setText(helper.getName(c));
			author.setText(helper.getAuthor(c));
			if (helper.getType(c).equals("adventure")) {
				icon.setImageResource(R.drawable.blue);
			}
			else if (helper.getType(c).equals("biography")) {
				icon.setImageResource(R.drawable.red);
			}
			else {
				icon.setImageResource(R.drawable.yellow);
			}
		}
	}

Update işlemi için onListClick metodunu da düzenleyelim

/**
	 * Listeden bir eleman seçilirse çalışıyor
	 */
	private AdapterView.OnItemClickListener onListClick=new	AdapterView.OnItemClickListener() {
		public void onItemClick(AdapterView<?> parent,View view, int position,long id) {
 
 
 
			/**
			 * listeden bir eleman seçildiğinde, global değişkenlerimizi seçilen liste
			 * elemanına göre dolduruyruz
			 */
			model.moveToPosition(position);
			name.setText(helper.getName(model));
			author.setText(helper.getAuthor(model));
			//date.init(current.getYear(),current.getMonth(), current.getDay(), null);
			comment.setText(helper.getComment(model));
 
			if (helper.getType(model).equals("adventure")) {
			types.check(R.id.adventure);
			}
			else if (helper.getType(model).equals("biography")) {
			types.check(R.id.biography);
			}
			else {
			types.check(R.id.documentary);
			}
			getTabHost().setCurrentTab(1);
		}
	};

Son olarak insert metodumuzu çağırdıktan hemen sonra listemizin refresh olması için model.requery(); metodunu çağırıyorum. Bu haliyle artık yeni kitap eklediğimizde database ekleniyor ve kapatıp açtığımızda bu kitaplar listede kalmaya devam ediyor.

Projenin kaynak kodlarını buradan indirebilirsiniz. Rar şifresi: www.kodmerkezi.net

<<< Önceki:

Sonraki: >>>


Facebookta Paylaş

6 yorum »

  • ali dedi ki:

    Merhaba
    KOd çok güzel ve yararlı. Anack birşey sormak istiyorum. Dropdownlist için bir örnek kodunuz varmı? Ancak burada Örneğin il ve ilçeler için iki drop down olacak. İli seçince diğer dorpdon da ilgili ilçeler olacak . Bunu nasıl yapabiliriz.

  • admin dedi ki:

    Buradaki cevapları okuyabilirsiniz

  • Cihan dedi ki:

    Merhaba

    Öncelikle ellerinize sağlık çok iyi bir çalışma olmuş son günlerde buna benzer bir araştırma yapıyordum bu database sanırım cihazın içersinde oluşturuluyor bunu internetteki bir hosttan çekmek için geliştirebilirmiyiz. tüm denemelerimde başarısız oldum.

    Çalışmalarınızın devamını dilerim.

  • yiğit dedi ki:

    SQL Lite Admin ile bir veritabanı oluşturup bu vt nı projemize import etme ve procedur trigger yazma nasıl yapılabilir bu konulardada bişeyler paylaşabilirmisiniz…
    teşekkkürler…

  • can dedi ki:

    bu paylaştıgınız kaynak kodlarını nasıl acıcam bi türlü beceremedim bu işte baya acemiyim lütfen yardım edermisiniz

  • admin dedi ki:

    Rar şifresi: http://www.kodmerkezi.net

Yorum Bırakın!

Yorum yaz, yada kendi sitende trackback (Geri besleme) olarak ekle. Ayrıca RSS ile bu konuya üye olabilirsin. .

Nazik olun. Temiz tutun. Konu dışına çıkmayın. Spam yaratmayın.

Bu tagları kullanabilirsiniz:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Bloğumuz gavatarı desteklemektedir. Kendi gavatarınızı edinmek için lütfen Gravatar a üye olun.