Android ile SQLite Kullanımı



Merhabalar, bugün SQLite ve Android ile SQLite kullanımından bahsedeceğiz.


SQLite Nedir?


SQLite, Android uygulamalarında verileri kalıcı olarak saklamak için kullanılan bir kütüphanedir. Özellikle hız ve performans açısından oldukça tercih edilen bir yöntemdir.


Neden SQLite Kullanıyoruz?


Veri saklama yollarından biri olan Shared Preferences’ı kullanmayı değil de neden SQLite’ı kullanmayı tercih ettik? Shared Preferences, verileri key-value (anahtar-değer) ilişkisi içinde tutan bir veri saklama yöntemidir. Kullanımı oldukça kolaydır, fakat büyük verileri tutmak için uygun değildir. Bu yüzden örneğimizde Shared Preferences kullanmak yerine SQLite kullanıyoruz.


Android ile SQLite kullanımını daha iyi anlamak için örnek bir uygulama üzerinden gideceğiz.


Android SQLite ile Okuma Listesi Uygulaması


Öncelikle yapacağımız uygulamadan bahsedelim. Okumak istenilen kitapların not edildiği, kitapların liste halinde gösterildiği basit bir “okuma listesi” uygulaması yapacağız. Uygulamanın son hali aşağıdaki gibi olacak.



Uygulamamızı yapmaya başlayabiliriz.


1. Adım


Android Studio’da yeni bir proje açıyoruz.


2. Adım


Okuma listemize yeni kitaplar eklemek için kullanacağımız AddingBookActivity adında yeni bir Activity sınıfı oluşturuyoruz. AddingBookActivity sınıfına ait activity_adding_book.xml dosyamızı açıyoruz ve kitap ismini ve yazar ismini girmek için iki tane EditText, girdiğimiz değerleri kaydetmek için bir tane buton ve tasarımın daha güzel görünmesi için bir ImageView ekliyoruz.


Activity_adding_book.xml Tasarımı


Activity_adding_book.xml Kodu



3. Adım


Okuma listemizi tanımlayacağımız activity_main.xml dosyamızı açıyoruz ve burada bir tane ListView ve bir tane de FloatingActionButton tanımlıyoruz. ListView verileri liste halinde göstermemizi sağlayan, kendi içinde satır satır TextView öğeleri bulunduran bir yapıdır.


Activity_main.xml Tasarımı


Activity_main.xml Kodu



4. Adım


Okuma listemizin her bir satırını temsil edecek olan row_list_item.xml dosyamızı açıyoruz. Bu tasarımda CardView kullanacağız. CardView, kart şeklinde bir görünüme sahip, metin ve görüntü içeriği sunan bir yapıdır. CardView içerisinde kitap adını ve yazar adını tutmak için iki tane TextView, silme ve güncelleme ikonlarını tutmak için iki tane ImageView tanımlıyoruz.


Not: İkonları tanımlamak için res-> drawable->New->Vector Asset adımını takip edebilirsiniz. Açılan Asset Studio penceresi sayesinde ikonunuzun ismi, rengi gibi çeşitli özelliklerini değiştirebilirsiniz. Farklı bir ikon kullanmak isterseniz, Clip Art kısmındaki ikona çift tıklayarak açılan Select Icon penceresinden dilediğiniz ikonu seçebilirsiniz.



Şimdi tekrar tasarımımıza dönebiliriz.


Row_list_item.xml Tasarımı


Row_list_item.xml Kodu




5. Adım


Uygulamamızın verilerini içerecek olan Book adında bir model sınıfı oluşturuyoruz ve içerisine değişken olarak id değerini tutmak için bir Int tipinde değişken, kitap ismi ve yazar ismini tutmak için iki String tipinde değişken ekliyoruz. Güncelleme işlemi için id değerinin de bulunduğu, ekleme işlemi için id değerinin bulunmadığı ve listeleme işlemi için de boş bir constructor tanımlıyoruz.




6. Adım


Okuma listemizin her satırında gerekli olan bilgileri göstermemizi sağlayacak olan BookAdapter adında bir Adapter sınıfı oluşturuyoruz. Adapter bir veri kaynağıyla, veriye ihtiyacı olan nesneyi birbirine bağlar ve veri kaynağındaki verileri görsel öğelerde kullanmaya uygun hale getirir. BookAdapter sınıfımızı oluşturduktan sonra BaseAdapter sınıfından türetiyor ve gerekli metodları override ediyoruz. Veritabanı işlemlerinden sonra bu adıma tekrar döneceğiz.




7. Adım


Veritabanı ile ilgili işlemlerimizi yapmak için bize yardımcı olacak olan DBHelper adında yeni bir sınıf oluşturuyoruz ve SQLiteOpenHelper sınıfından extends ediyoruz.


SQLiteOpenHelper veritabanı oluşturma ve sürüm yönetimini yönetmek için kullanılan yardımcı bir sınıftır. Öncelikle veritabanımızın adını, tablomuzun adını ve sütunlarımızın adını tanımlıyoruz. Bu sınıfta context, veritabanı adı, cursor ve veritabanı versiyonunu belirtiyoruz. Cursor veritabanı üzerinde işlem yapabilmek için kullanılan bir nesnedir, varsayılan cursor'ı kullanacağımız için null yazıyoruz. Daha sonra onCreate() ve onUpgrade() metodlarını override ediyoruz.

  • onCreate metodu, veritabanı henüz oluşturulmamışsa bir veritabanı oluşturur ve metot içerisinde yer alan sorguları çalıştırır.

  • onUpgrade metodu ise veritabanında bir güncelleme gerekiyorsa çağrılır ve metot içerisinde ilgili sorgular çalıştırılır.


Şimdi bu metodlarımızı tek tek dolduralım.


onCreate(db: SQLiteDatabase?)


Öncelikle tablo oluşturmak için bir sorgu yazıyoruz. Bu sorgudaki col_id değeri primary key (ana anahtar, birincil anahtar) olarak tanımlanmıştır ve tekildir. Yani her kaydın id değeri diğerinden farklıdır. AUTOINCREMENT ise eklenen her satırda bu id değerinin otomatik olarak artmasını sağlar. col_book ve col_author kitap ismine ve kitabın yazarına karşılık gelir ve TEXT veri tipindedir. Sorgumuzu tamamladıktan sonra createTable adlı değişkenimize atıyoruz. Daha sonra execSQL komutu ile oluşturduğumuz SQL sorgusunu veritabanında çalıştırıyoruz.



onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int)


Burada tablomuzu silmek için bir sorgu yazıyoruz ve execSQL komutu ile sorgumuzu çalıştırıyoruz. Daha sonra onCreate metodu ile tablomuzu yeniden oluşturuyoruz.




8. Adım


Bu adımda DBHelper sınıfında CRUD (Create, Read, Update, Delete) olarak adlandırılan, veritabanı üzerinde ekleme, listeleme, güncelleme ve silme, işlemlerini yapacağız.

  • Veri Ekleme: insertBook() metodu sayesinde veritabanına yeni veriler ekleyeceğiz.



Öncelikle verileri yazmak için writableDatabase ile veritabanına ulaşıyoruz. Daha sonra değerleri tutmak için values adında bir ContentValues() değişkeni tanımlıyoruz.

ContentValues sınıfı, tabloda yer alan sütun adı ve bu sütunlara doldurulacak değerlerin girildiği bir yapıdır. ContentValues() ve put metodu yardımıyla col_book içerisinde bulunan sütuna kitap ismini, col_author içerisinde bulunan sütuna ise kitabın yazarını ekliyoruz. insert metodu sayesinde tablo adı ve ContentValues içerisinde yer alan değerler ile veritabanına bir satır ekliyoruz. db.close() diyerek veritabanı bağlantısını kapatıyoruz.

  • Verileri Listeleme: getAllBooks() metodu sayesinde veritabanında bulunan tüm kitapları listeleyeceğiz.



İlk olarak veritabanından gelen sonuçları bir ArrayList içerisinde tutuyoruz. Daha sonra verileri okumak için readableDatabase ile veritabanına ulaşıyoruz. Veritabanında bulunan tüm kayıtları getirmesi için gerekli sorguyu yazıyoruz ve query değişkenine atıyoruz. rawQuery metodu ile sorgumuzu çalıştırıyoruz, sorgu sonucunda oluşan sonucu cursor değişkeninde tutuyoruz. Cursor değişkeni ve moveToNext metodu ile ilk satırdan başlayarak while döngüsü içerisinde tüm satırları dolaşıyoruz. Döngü içerisinde sütunlara sırsıyla ulaşıyoruz. getInt metodu ile id değerine, getString metodu ile ise kitap ismi ve yazar ismine ulaşıyoruz. Böylece her satırı bir Book nesnesi içerisinde saklıyoruz ve dizimize ekliyoruz ve bütün kitapları bir dizi şeklinde döndürüyoruz. db.close() diyerek veritabanı bağlantısını kapatıyoruz.

  • Veri Güncelleme: updateBook() metodu sayesinde veritabanında bulunan istediğimiz satırı güncelleyeceğiz.


Bu metod insert metoduyla çok benzer bir yapıdadır. update metodu tablo adı ve ContentValues içerisinde yer alan değerler ve id ile bir UPDATE sorgusu hazırlar ve veritabanında istenen satırın güncellenmesini sağlar. Burada arrayOf() içerisinde id değerini bir String’e dönüştürüyoruz ve bu ifade id=? yerine gelmiş oluyor. Örneğin, id değeri 2 olan satırı güncellemek istiyoruz, id=? yerine id=2 gelir ve 2 numaralı id değerine sahip olan satır güncellenir.


Veri Silme: deleteBook() metodu sayesinde veritabanında bulunan istediğimiz satırı sileceğiz.



Silme işlemi yaparken de güncelleme işlemi gibi id değerine ihtiyaç duyarız. delete metodu tablo adı ve id ile bir DELETE sorgusu hazırlar ve veritabanında istenen satırın silinmesini sağlar.



9. Adım


Veritabanı ile ilgili işlemleri hallettiğimize göre BookAdapter sınıfına tekrar dönebilir ve

metodlarımızı doldurabiliriz.

  • getView(position: Int, convertView: View?, parent: ViewGroup?): Bu metot, liste öğesi görünümü görüntülenmeye hazır olduğunda veya görüntülenmek üzere olduğunda otomatik olarak çağrılır. Bu metot ile LayoutInflater sınıfını kullanarak liste öğelerinin düzenini ayarlıyoruz ve ardından verileri ImageView, TextView vb. gibi görünümlere ekliyoruz. Ayrıca güncelleme ikonuna tıklanıldığında kitap ekleme sayfasına gidilmesini, silme ikonuna tıklanıldığında ise DBHelper sınıfında yazdığımız silme metodunu kullanarak dilediğimiz satırın silinmesini sağlıyoruz.


  • getItem(position: Int): Bu metot sayesinde position ile belirtilen satırdaki nesneyi döndürüyoruz.

  • getItemId(position: Int): Bu metot ile position ile belirtilen satırın id değerini döndürüyoruz.

  • getCount(): Bu metodu kullanarak listedeki eleman sayısını döndürüyoruz.

  • goToUpdate(book: Book): Bu metot sayesinde güncelleme işlemi yapabilmek için intent aracılığı ile AddingBookActivity sınıfına gidiyoruz.



10. Adım


Bu adımda DBHelper sınıfında yazdığımız güncelleme ve ekleme metodlarını kullanarak dilediğimiz satırın güncellenmesini ya da yeni bir satır eklenmesini sağlıyoruz. Eğer satır 0'dan farklı bir id değerine sahipse güncelleme işlemi, eğer satır henüz bir id değerine sahip değilse, yani henüz oluşmamışsa ekleme işlemi yapıyoruz.




11. Adım


Son olarak MainActivity sınıfımızı inceleyelim ve uygulamamızı bitirelim. Burada goToAdd() metodu, FloatingActionButton’a tıklanıldığında bizi kitap ekleme sayfasına yönlendiriyor. loadData() metodunda ise ilk olarak bir DBHelper oluşturarak veritabanı bağlantısı kuruyoruz ve kitapları getAllBooks() metoduyla veritabanından çağırarak oluşturduğumuz BookAdapter ile listeliyoruz. Daha sonra bu metodumuzu onResume() metodu içerisinde çağırıyoruz. onResume() metodu bulunduğu sınıf her açıldığında çalışır. Böylece okuma listesinde herhangi bir değişiklik yapıldığında, örneğin kitapları listeledikten sonra listeye yeni bir kitap eklediğimizde, bu değişikliğin listeye yansımasını sağlıyor.



Tüm adımlarımızı bitirdik, şimdi uygulamamızı çalıştırabiliriz.



"Android ile SQLite Kullanımı" yazımızın sonuna geldik, umarım bu içerik sizin için faydalı olmuştur. Bir sonraki yazıda görüşmek dileğiyle, keyifli kodlamalar.


Projenin kaynak kodlarına ulaşmak için:

https://github.com/emineinan/ReadingList-AndroidSQLite


#android #kotlin #sqlite





0 yorum

Son Paylaşımlar

Hepsini Gör