Android Programlama – Veritabanı, SQLiteOpenHelper, Cursor
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;
- Eclipse Üzerine Android Sdk Kurulumu (Resimli ve Detaylı Windows – Linux – Mac İçin Anlatım)
- Android Programlama – Basit Form Uygulaması
- Android Programlama – TableLayout-Radio Button
- Android Programlama – ListView-Spinner-AutoCompleteTextView-Adapter
- Android Programlama – Özelleştirilmiş ListView
- Android Programlama – TabView, TabHost, TabWidget, FrameLayout – DatePicker
- Android Programlama – Menu, Toast, AlertDialog
- Android Programlama – Progress Bar, Thread
- Android Programlama – lifeCycle, onPause(), onResume()
- Android Programlama – Landscape, Portrait, String.xml
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.netBunlara da Göz Atmak İsteyebilirsiniz.
<<< Önceki: Maven Nedir? Pom Nedir? Nasıl Kullanılır? Örnek Uygulama
Sonraki: Windows Üzerine Opencv Kurulumu ve Visual Studio 2010 ile Entegrasyonu >>>
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.
Buradaki cevapları okuyabilirsiniz
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.
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…
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
Rar şifresi: http://www.kodmerkezi.net
Yorum Bırakın!
En Son Yazılanlar
Codeigniter Dersleri
Kategoriler
Teknoloji Haberleri
Android Dersleri
Arşiv
İstatistikler
Sitemizin QR Kodu
Yeniliklerden İlk Sizin Haberiniz Olsun
KodMerkezi.Net Facebookta
En Çok Okunanlar
En Son Aranan Kelimeler
En Çok Oy Alanlar
Etiket Bulutu
İlginizi Çekecek Siteler
Arşiv
Yönetim
En Son Yapılan Yorumlar
En Çok Okunanlar