Merhaba arkadaşlar. Hangi dili öğrenirseniz öğrenin, işin en zevkli kısmı veritabanı işlemleridir ve veritabanını öğrendikçe daha kaliteli uygulamalar yapmak istersiniz. Ben de bu derse, android üzerinde basit olarak sqlite ile veritabanı kullanımı konusunu anlatacağım.
Android Veritabanı İşlemleri ve SQLite Kullanımı
Android uygulamalarımızda veritabanı olarak genelde SQLite dediğimiz açık kaynak kodlu veritabanı kullanılır. Bu veritabanı, birçok programlama dili ile uyumludur. Android ile beraber kullanıldığında hızlı çalışır ve performansı yüksektir.
Şimdi zaman kaybetmeden bir proje oluşturalım ve sayfamızın görüntüsünü şu şekilde yapalım.
Burada basit bir örnek oluşturmak için önce ad ve soyadı alacağız. Kaydet butonuna tıkladığımızda bunları veritabanına kaydedecek ve daha sonra Bilgileri Getir dediğimizde de alttaki Large Text alanlarına bunları getirecek.
Daha sonra src altındaki pakete sağ tıklayarak New-Class diyoruz ve yeni bir sınıf oluşturuyoruz. Bu sınıfımızı ben aşağıdaki isimle oluşturdum.
Buradaki sınıfımızda, veritabanıyla ilgili işlemleri yapacağız. O yüzden oluşturduk. Sınıfımızı oluşturduktan sonra ben sınıfın içerisine temel şeyleri yazacağım ve daha sonra bunların ne anlama geldiklerini açıklayacağım.
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ü. Bunları static ve final olarak tanımladık yani bir nevi sabit. 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. 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.
Burada Veritabani adlı sınıfımızın altını çizdi. Yanındaki kırmızı çarpıya basıp Add Unimplement Method diyerek 2 adet metod ekliyoruz. Metodların eklenmiş hali aşağıdaki gibidir.
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. Bu metodlardan 1 numaralı olanda genelde veritabanı işlemleri oluşturulur. Burada yapılacak olan işlemler 1 defalığına yapılır. 2 numaralı metodda ise sürüm güncelleştirmelerinde yapılacak olanlar yazılır.
Bu alanlara aşağıdaki gibi kodları yazalım
onCreate() metodunun içerisine, parametre olarak aldığı db nesnesinin execSQL() metodunu yazdık. Bu execSQL metodu, parametre olarak aldığı sorguyu çalıştırır. Biz sorgumuzda bilgiler adında bir tablo oluşturduk. Bu tablo da TEXT tipinde ad ve soyad 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.
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.
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 numaralı alanda ise Kaydet butonuna tıklandığında yapılacakları yazacağız. Şimdi bu sayfayı biraz daha dolduralım.
Evet sınıfımızın içini yavaş yavaş dolduruyoruz. Burada veritabanı ile ilgili işlemleri yapacağız. 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 2 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 2 parametre alıyor. 4. 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. Peki 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. İleride bazı örnekleri insert() ile yapacağım. İlk parametresi tablo adı, diğer parametre null, son parametre ise ContentValues nesnemizdir.
Şimdi buradaki alanları açıklayalım. 1 numaralı alanda Göster butonu için listener yazıldı. 2 numaralı alanda, bu butona tıklandığında bilgileriGoster() metoduna gidilmesi sağlandı. 3. alanda hangi sütundaki verileri çekeceğimizi gösteren bir dizi şeklinde oluşturduk.
4.alanda yine bir db nesnesi oluşturduk fakat okuma yapacağımız için bu sefer getReadableDatabase() metodunu kullandık. 5.alanda bir Cursor nesnesi tanımladık. Cursor, veritabanından çekilen veriler arasında gezinmeyi sağlar. db nesnesinin query() metodunu çalıştırdık. Parametre olarak da ilk olarak tablo adı, daha sonra veritabanından okunacak alanı gösterdik. Kalan 5 null değeri sırasıyla ; where koşulu, where koşulunun değerleri, groupby, having, orderby’dır. Biz bunların belirlenmesini istemediğimiz için null belirledik. Bu arada bu dersi anlatırken SQL sorgularını bildiğinizi varsayıyorum. 6.alanda bu okunanlar adındaki Cursor nesnesi ile satır satır okuma yaptık. Bunun için while içerisinde moveToNext() metodunu kullandık.
7.alanda ise bu okunan değerleri add ve soyadd değişkenlerine attık. Değerleri alırken de sütun isimleri olan ad ve soyad parametrelerini verdik ki o sütundaki ilk verileri alsın. 8.alanda da bunları textview nesnelerine atarak ekrana yazdırdık.
Ekran Çıktıları
Bu derste androidde veritabanı işlemlerine giriş yaptık. Temel olarak veritabanı,tablo oluşturmayı ve kayıt eklemeyi ve kayıtları çekmeyi anlattık. Diğer derslerde silme, güncelleme gibi işlemleri yapacağım ve farklı ekleme yöntemlerinden bahsedeceğim.
Hocam merhaba…
Emeğinize sağlık. Çok faydalı bir ders oldu.
Çok yararlı bir yazı dizisi.
merabalar hocam dersleriniz çok yararlı oluyor bizim için çok teşekkür ederim.
ama ben şöyle bir hata aldım yardımcı olabilirseniz çok sevinirim internette araştırdım ama sağlıklı bir sonuç bulamadım…
"the source attachment does not contain the source for the file sqlitedatabase class" bunun için ne yapabilirim??
saygılarımla..
Teşekkür ederim ama malesef bir fikrim yok.
Unfortunetly Veritabani has stopped. diye uyarı alıyorum hocam kaydet butonuna bastığımda nereyi yanlış yapmış olabilirim hocam.
bende yukarıdaki gibi kaydet butona basınca veritabanı has stopped diye hata alıyorm uygulama kapanıyor araştırdım ama çözümü ile ilgili pek bişey bulamadım yardımcı olursanız çok sevinir oyaladı çözüm aramak baya
Hata alanlar için :
cv1.put kısmında tırnak içerisindeki alanları “ad” ve “soyad” olarak düzeltin. Eğer yine hata alıyorsanız buton ve edittexleri bağlarken id’lerin uygun olup olmadığını kontrol edin
Merhaba, andoroid telefondan uzaktaki bi database bağlanıp internet üzerinden , bu veritanında işlem yapmayı nasıl gerçekleştirebiliriz
Merhaba. Yakın zamanda onunla ilgili bir ders yayınlayacağım
aynı hatayı bende alıyorum Unfortunetly Veritabani has stopped.
şeklinde çözüm bulan var mı acaba.
merhaba. Hocam internet üzerinden dataubase bağlanıp işlemler yapma ile ilgili bir örnek uygulama yayınlayacağını söylemşsin. Sitede bulamadım hocam size zahmet bu konuyla ilgli bir örnek uygulma yayınlarsanız çok makbule geçer
aynen kaydet butonuna basınca Unfortunately veritabani1 has stoped hatası alıyorum.bunun nedeni ne olabilir hiçbir hata da göremiyorum hepsi tam gibi acaba emilatörden mi gercek cihaza atsam çalışırmı bi deneyejem.çözüm bulan varsa yazsın lütfen…
ekleme() fonksiyonunun aldığı parametreleri ad,soyad olarak düzeltin ve fonksiyonun içerisinde de adi ve soyadi yerine ad ve soyad parametrelerini atayın
Teşekkürler adım adım takip ederek , verilen hatayı görüp bırakmayarak hatanın kaynağını görüp , ufak düzeltmelerle 1 harfin çalışmamaya neden olmasını engelleyerke , sonunda çalıştırdım . Birde hocam android ve java derslerinde kitabınızı kullanıyoruz , isimden tanıyamadım k.bakmayın , kitabda isminizi görünce anladım. Güzel paylaşımlarınız için teşekkürler.
hocam gayet güzel anlatmışsınız.. lakin güncellemede sıkıntı var sanki.. şöyle ki kodlarımıd aşağıda veriorum.. Benim adisoyadi,eposta,mesaj diye 3 tane alanım var.. Bunların adisoyadi olan kısmı güncellenmiyor.. Neden olabilir.. zannedersem en son kısmındaki adisoyadi na göre güncelleme yaptıdığı için bunu id sine göre düzenlesek olur mu. orasını nasıl yaparım. id isimli bir sütunum daha var int değerli.. Teşekkürler..
duzenle.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
Guncelle(adisoyadi.getText().toString(),
eposta.getText().toString(),mesaj.getText().toString());
Toast.makeText(getApplicationContext(), “Güncellendi”,
Toast.LENGTH_LONG).show();
adisoyadi.setText(null);
eposta.setText(null);
mesaj.setText(null);
} catch (Exception e) {
Toast.makeText(getApplicationContext(), “Güncelleme Hatası n”+e,
Toast.LENGTH_LONG).show();
}
}
});
}
private void Guncelle(String adisoyadi, String eposta, String mesaj) {
SQLiteDatabase db = v1.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(“adisoyadi”, adisoyadi);
cv.put(“eposta”, eposta);
cv.put(“mesaj”, mesaj);
db.update(“veriler”, cv, “adisoyadi”+”=?”, new String[] { adisoyadi});
db.close();
}
Diğer 2 veritabanı dersine de bir göz atın. Bir harf ya da nokta hatası bile güncelleme hatasına sebep olabilir. 3.derste daha ayrıntılı şekilde anlattım.
Hocam merhaba bende her şey tamamdır ama “Girilen ad” karşısındaki kutucukta “LargeText, “Girilen Soyad” yerine de kaydedilen isim geliyor.. Ben nerede hata yapmış olabilirim teşekkür ederim şimdiden..
Merhaba. id eşleştirmeleriniz yanlıştır muhtemelen. Sayfanızdaki textview’ın id’leriyle koddaki id’leri karşılaştırın.
Hocam öncelikle teşekkür ederim.
Uygulamayı çalıştırdığımda kayıt işlemi sorunsuz çalışıyor fakat görüntülemede nullpoint hatası alıyorum.Mainactivity ve tab2activity diye 2 farklı class kullanıyorum. Mainactivityden nesne türettim tab2 içinde. Onun aracılığı ile mainactivity de oluşturduğum değişkenlere erişim sağlıyorum. Okuma için kodlarım şu şekilde;
SQLiteDatabase db=m1.v1.getReadableDatabase();
Cursor okunanlar = db.query(“bilgiler”, sutunlar, null, null, null, null, null);
while(okunanlar.moveToNext())
{
String add = okunanlar.getString(okunanlar.getColumnIndex(“ad”));
String soyadd = okunanlar.getString(okunanlar.getColumnIndex(“soyad”));
m1.ad1.setText(add);
m1.ad2.setText(soyadd);
}
Debug yapın hangi satırda hata veriyor bakın ya da her satırda tüm değişkenlerin içeriğine tek tek bakın
hocam uzaktan bir database bağlanmayı nasıl yapıcaz verileri oraya kaydedip çağırmam için
Jdbc kullanın ya da web servis hazırlayın ve o web servise bağlanarak veritabanı işlemlerini yapın
peki örnek bi uygulamanız varmı sorduğum soru ile ilgili
Yok maalesef. Ama yapmayı düşünüyorum
çok iyi olur mehmet bey.Rica etsem aktif olarak kullandığınız e-mail adresinizi verirmisiniz
İletişim sayfasında yazıyor. İyi günler
hafız derslere ara verdin olmuyor böyle hafız
unfortunately has stopped hatası alan arkadalar layout kodlarını dikkatlice incelesinler. EN güzeli Mehmet hocamın da dediği gibi debug edip satır satır kontrol etmek.
hocam bu veriler nerede tutuluyor id ekledim ama birtürlü çekmedim
Elinize Sağlık
Teşekkürler 🙂
Merhaba, Mehmet Bey öncelikle paylaşımlarınız için çok teşekkür ederiz. Kod gayet stabil çalışıyor. ‘Unfortunately has stopped’ hatası alan arkadaşlar kodlarında sadece EditText değil de Spinner veya RadioButton kullanıyorsa tanımlamaları farklı yapılıyor. O yüzden add kısmında null gidiyor olabilir..
Merhaba. Çok teşekkürler.
Merhaba ,bir veritabanının dolu ya da boş olduğun nasıl anlarız
Merhaba. Select sorgusu atın. 0 dönerse boştur. Ya da özel metodlar var queryResult gibi. Onlar doğrudan boş mu dolu mu kontrolü yapıyor. Biraz araştırabilirsiniz
Merhaba Hocam Verdiğiniz örnekteki kısmıları harfi harfine yapmama rağmen kaydet butonuna bastığım zaman hiç bir olay gerçekleşmiyor sebebi nedir acaba
Bunu anlamanin tek yolu debug yaparak nerede hata veriyor bulmanizdir:)
Merhaba hocam daha önce sorduğum sorunu hallettim şimdiki sadece meraktan bu kaydettiğim verileri nerede görebilirim 😀
Merhaba. 3. Yazimda var bunun cevabi
Sayın Hocam,
Bu dersinizde tabloya kayıt eklemeyi ve okumayı çok iyi anlatmışsınız, sağolun. Fakat, tablodaki birden fazla kaydı listelemeyi de gösterebilirdiniz belki.
Saygılarımla
Merhabalar hocam yazınızdan faydalanarak android uygulamamda sqlite veritabanı bağlantısı yaptım fakat uygulamamı farklı her emülatorde açtığımda veritabanınını yeniden oluşturuyor yazdığınız gibi peki varolan veritabanını projeye nasıl ekleyebiliriz dosya yolunu kullanarak veritabanına nasıl kayıt yapabiliriz
Merhaba. Varolan veritabanını kopyalayıp hazır olan .sqlite uzantılı dosya ile yer değiştirin. Her açtığınızda yeniden oluşturur ama içindekileri silmemesi gerek.
Hocam öncelikle bu güzel paylaşım için teşekkür ediyorum.
Bende bazı arkadaşlarım gibi hata alıyorum. Programın tüm satırlarını debug ettim ve sorun veri tabanını kapattığımız noktada ( v1.close(); ) ortaya cıkıyor. Bunun hakkında yardımcı olursanız sevinirim.
Hata mesajı nedir hocam yazar mısınız ?
HOCAM GUNLERDIR ARAYIP DA BULDUGUM EN VERIMLI DERS. COKLU TABLO ORNEK CALISMALARINIZ VARSA DERS LINKI ALABILIR MIYIM? TUM DERSLERINIZE BAKACAGIM AMA SONUCTAN BASLAMAK BENI MOTIVE EDIYOR.
Hocam merhaba. Ben android uygulama geliştirmek istiyorum ama bu bir web uygulaması olacak. Bu durumda veritabanı olarak sql lite mi kullanıcım .sunucu üzerinden mi bağlantı gerçekleşecek.yoksa web servis mi kullanılacak .Yardımcı olursanız çok sevinirim 🙂
Merhaba. Web uygulaması derken online çalışan bir uygulamaysa uzak sunucu kullanacaksınız. Web servis kullanırsanız daha hızlı ve sistematik kodunuz olur. Sqlite sadece lokal veritabanında bilgiler tutar. Sadece siz görürsünüz yani
Kod hatasız çalışıyor, application has stopped hatası alıyorsanız, androidmanifest dosyasında hata olmadığından emin olun.
Android manisfest dosyasında ne gibi bir hata olabilir hiç dokunmadıkki. intent kavramıda yok..
Bilgileri kaydederken sıkıntı yok. ancak göster deyince problem var. lütfen kodları yayınlar mısınız.
göstermede veritabanı durdu hatası alıyorsanız…
String add= okunanlar.getString(okunanlar.getColumnIndex(“ad”));
yerine
String add= okunanlar.getString(0);
kullanmak sorunu çözüyor. column index -1 hatası yüzünden veritabanı durdu diyor..
ekleme veya göster işleminin başarılı olduğunu göstermek için mesaj box ile
ekle fonksiyonu çağırıldıktan sonra
Dialog dialog = new Dialog(MainActivity.this);
dialog.setTitle(“Ekleme İşlemi”);
TextView tvSonuc = new TextView(MainActivity.this);
tvSonuc.setText(“BAŞARILI”);
dialog.setContentView(tvSonuc);
dialog.show();
kullanabilirsiniz.
Allah razı olsun abim
Yazdığınız Kodları indirebileceğimiz dökümanıda yazarmısınız.
Tekrar resimlerden yazmak biraz zahmetli oluyor.
Bazılarının kodları var ama başlangıçta üşenmeden yazın diye resim olarak ekledim.
isn’t responding hatası alıyorum neden olabilir teker teker harf harf herşeyi kontrol ettim lutfenyarım edin
debug yaparak hatayı çözdüm gerek kalmadı sağolun