Android Not Alma Uygulaması Yapalım -1(SQLite Kullanımını Öğrenelim)

Şerifhan Işıklı
lTunes Tribe
Published in
5 min readAug 12, 2019

İlk olarak bu öğretici projemiz makalelerin uzunluğu ve okunurluğu açısından sağlıklı olabilmesi için toplam 3 farklı makale başlığıyla incelenecektir.Haydi Başlayalım.

Android’e adım atanların bu sıralar Realm Veri Tabanı ile karşılaşmasına rağmen, SQLite büyük bir ölçüde kullanıma sahiptir. Android’e yeni başlayan kişilerin (özellikle web tabanlı olanlar ) öğrenme aşamasında bazen zorluklar çektiğini düşünüyorum. Bende bunlardan biriydim. İlk olarak SQLite ne olduğundan bahsedeyim sizlere; C/C++ programlama dilleriyle geliştirilmiş sunucu gereksinimi olmayan bir SQL veritabanı motorudur. SQLite, Richard Hipp tarafından 2000 yılında tasarlandı. O dönemde General Dynamics firmasında Amerikan Donanması için yapılan bir projede çalışan Hipp, bir veritabanı kurulumu ya da yönetim paneline ihtiyaç duymayan program yazmaya çalışırken SQLite’ı geliştirdi.

Yani SQLite bir veritabanıdır. Ama web tabanlı gelen kişilerin düşündüğü MYSQL gibi bir veritabanı değildir. Herhangi bir panele veya sunucu tarafına ihtiyaç duymadan çalışan bir veri tabanıdır. O yüzden SQLite’tı kullanmadan önce projeniz için saklayacağınız verilerin boyutları yüksek ise veya zamanla sürekli bilgi girişi ile saklanacak verinin boyutu artacak ise kesinlikle önermiyorum. Örneğin; Kullanıcı bilgileri, anlık bilgi notları yada anlık cache sistemi gibi şeylerde işinize çok yaracaktır.

1. Yeni Android Projesi Oluşturalım.

Android Studio’da sol üst taraftan File ⇒ New Project seçeneğini seçip, bize gösterilen şablonlardan Basic Activity yazılı olanı seçerek bir Android proje oluşturalım. Burada yazan API level gibi diğer seçeneklerin bir önemi yoktur.

Proje dosya görünümü Android ise Gradle Script , Proje dosya görünümü Project ise app dizini altında bulunan build.gradle(Module:app) dosyasını açın ve RecyclerView kütüphanesini ekleyin. Bu kütüphane notların listelenmesinde kullanılacaktır. Kod da oluşan kızarıkların sebebi appcompat ile recyclerview’in uygulamanızda belirlediğiniz compileSdkVersion ile aynı versiyona sahip olma isteğidir. Mouse ile kırmızı olarak gözüken kod parcacıklarına gelip Alt + Enter tuşlarına basarak sunulan öneriyi gerçekleştirip bunu kolayca yapabilirsiniz. ( Yada el ile

implementation ‘com.android.support:recyclerview-v7:28.0.0’

kütüphanesini ekleyebilirsiniz. )

Uygulamayı yapmadan önce ; color.xml, dimens.xml, strings.xml dosyalarına aşağıdaki kod parçaçıklarını ekleyelim.

Ve ekstra olarak projemizde Android görünümü altında;

Database(Package, Database/Model(database altında package), Utils(Package) ve View(Package) isimlerinde paketler oluşturun.Bu paket isimlerine veya sınıf isimlerine istediğiniz ismi verebilirsiniz. Ama genel olarak programcılar arasında bu isimler yazılı olmayan kurallardır diyebiliriz. Bu yüzden global kurallara uyarak devam etmenizi öneririm.

colors.xml

colors.xml dosyası

dimens.xml;

dimens.xml dosyası

strings.xml;

2-) SQLite Helper Sınıfının Oluşturulması

Web programlama temelli arkadaşların aşina olacağı Helper sınıfına benzer Android’in resmi kütüphanesi olan SQLiteOpenHelper sınıfını miras alarak yeni bir sınıf oluşturalım. Bu sınıf veri tabanlarının temel işlemleri olan CRUD(Create, Read, Update, Delete) işlemlerini yapmamızı sağlayacaktır. Yani notlarımız için gerekli olan ekleme, okuma, güncelleme ve silme işlemlerini kapsayacak şekilde ayarlanacaktır.

Veri tabanına kayıt edilen notları daha kolay yönetebilmek için Notes modelini oluşturalım.

database/model paketi altında, Note.java sınıfı oluşturun. Bu sınıf içerisinde tablo ismi, sütunlar, bu tabloya ait SQL sorgularını ve getter/setter methodlarını içermektedir. Daha öncesinde RecyclerView ile çalışan kişiler varsa döndüreceğimiz nesneler için oluşturduğumuz Model sınıfını aklınıza getirebilirsiniz.

  • `notes` tablosu `id`, `note` and `timestamp` gibi sütunları içermektedir.
  • `id` sütunu eklenen notların tekil olmasını sağlamada kullanılan alandır.
  • `note` sütunu yazılan notların tutulduğu alandır.
  • `timestamp` sütunu eklenen notların kayıt tarihini tutmada kullanılan alandır.

Database paketi oluşturmuştuk bunun altında direk New -> Java Class seçeneklerini izleyerek , DatabaseHelper.java adında ve SQLiteOpenHelper sınıfını miras alan bir sınıf oluşturun. Bu sınıf veritabanı için yapılacak tüm işlemlerde kullanılacaktır.

  • onCreate() fonksiyonu uygulama yüklendiğinde sadece bir kere çağrılmaktadır. Bu metod, uygulamada kullanılacak veritabanı ve bu veri tabanında kullanılacak olan tabloların oluşturulmasında kullanılmaktadır.
  • Tablolarda herhangi bir güncelleme gerektiğinde onUpgrade() fonksiyonu kullanılmaktadır. Herhangi bir güncelleme olup olmadığını DATABASE_VERSION numarasına göre bakabilirsiniz. Tabloda herhangi bir değişiklik durumunda bu numaranın yükseltilmesi yeterli olacaktır. Yapılan örnekte mevcut olan tabloların tümünün silinmesi ve yeniden oluşturulması sağlanmıştır. DatabaseHelper sınıfından sonra artık notların kayıt edileceği bir veritabanı oluşturmuş olduk. Daha sonrasında notları eklemeyi yapacağız.

DatabaseHelper.java ;

3-) Not Eklenmesi ;

Not ekleme işlemini yapabilmemiz için veri tabanına yazma işlemi için kendimize yol açmamız gerekmektedir. Bu imkanı sunan getWritableDatabase() metoduna erişim sağlamalıyız. Aşağıdaki kodlamada veritabanına yeni bir notun nasıl kayıt edildiğini görebilirsiniz;

  • ContentValues() sütun isimlerinin belirlenmesi ve verilerin kayıt edilmesinde kullanılmaktadır. Burada, `id` and `timestamp` sütunları otomatik olarak oluşturulacağı için bunları ekleme işleminde tanımlamıyoruz.
  • Her zaman veri tabanında yapılacak işlemin bitirilmesinin ardından db.close() metodunun çağrılması gerekmektedir. db.close() metodunun çağrılması aktif olan bağlantının kapatılmasını sağlamaktadır.
  • Bir yeni kayıt oluşturulduğunda eklenen kayda ait `id` verisi dönecektir.

Aşağıda DatabaseHelper sınıfına eklemeniz gereken insertNote fonksiyonunu görebilirisiniz.

public long insertNote(String note) {
// veritabanına erişimde kullanılacak nesne
SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues();
// `id` and `timestamp` otomatik oluşturulduğu için eklemeye gerek yoktur.
values.put(Note.COLUMN_NOTE, note);

// yeni kayıt oluştur
long id = db.insert(Note.TABLE_NAME, null, values);

// bağlantıyı kapat
db.close();

// yeni eklenen kaydın id bilgisini dönebilirsin.
return id;
}

4-)Not Listelenmesi

Bu method veritabanımızı okuma imkanı sunan getReadableDatabase() methoduna bağlanmayı sağlamaktadır ;

  • getNote() metodu ile iletilen `id` parametresine bağlı olarak ilişkili notun döndürülmesi sağlanmıştır.
  • getAllNotes() metodunun çağrılması ile veri tabanında kayıtlı tüm notların getirilmesi sağlanmıştır.
  • getNotesCount() metodu ile veri tabanında kayıtlı bulunan notların sayısını dönmektedir.

Notların Listelenmesi sağlayan DatabaseHelper sınıfına yazılacak olan method aşağıdaki gibidir.

public Note getNote(long id) {
SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.query(Note.TABLE_NAME,
new String[]{Note.COLUMN_ID, Note.COLUMN_NOTE, Note.COLUMN_TIMESTAMP},
Note.COLUMN_ID + "=?",
new String[]{String.valueOf(id)}, null, null, null, null);

if (cursor != null)
cursor.moveToFirst();

Note note = new Note(
cursor.getInt(cursor.getColumnIndex(Note.COLUMN_ID)),
cursor.getString(cursor.getColumnIndex(Note.COLUMN_NOTE)),
cursor.getString(cursor.getColumnIndex(Note.COLUMN_TIMESTAMP)));

// veritabanı bağlantısını kapatalım
cursor.close();

return note;
}

public List getAllNotes() {
List notes = new ArrayList<>();

// Select Sorgusu
String selectQuery = "SELECT * FROM " + Note.TABLE_NAME + " ORDER BY " +
Note.COLUMN_TIMESTAMP + " DESC";

SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);

if (cursor.moveToFirst()) {
do {
Note note = new Note();
note.setId(cursor.getInt(cursor.getColumnIndex(Note.COLUMN_ID)));
note.setNote(cursor.getString(cursor.getColumnIndex(Note.COLUMN_NOTE)));
note.setTimestamp(cursor.getString(cursor.getColumnIndex(Note.COLUMN_TIMESTAMP)));

notes.add(note);
} while (cursor.moveToNext());
}

// veritabanı bağlantısını kapatalım
db.close();

// notların tümünü döner
return notes;
}

public int getNotesCount() {
String countQuery = "SELECT * FROM " + Note.TABLE_NAME;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);

int count = cursor.getCount();
cursor.close();


// notların sayısını döner
return count;
}

Bir sonraki yazımda Notların Güncellenmesi ,Silinmesi ( AlertDialog.Builder sınıfı ile ) yapılacaktır. RecyclerView Listener, ItemDecoration Sınıfları oluşturulacaktır. En sonunda ise buna uyan bir tasarım ile konu bitirilecektir. Daha sonrasında bu yazının altında ilgili devam yazılarının linkini de bulabilirsiniz.

— Türkçe Kaynak Üreten Herkese Saygılarımla —

--

--

Şerifhan Işıklı
lTunes Tribe

Senior Software Engineer @Dogus Teknoloji. (Fitness & cycling)