Friday, September 18, 2015

Android SQLite - Selangkah demi selangkah

Android menyediakan penyimpanan data secara lokal dengan menggunakan sqlite. SQLite sendiri adalah database yg tidak memerlukan RDBMS utk operasinya (serverless) melainkan hanya sebuah kode pustaka (shared library). Beberapa karakteristik dari SQLite sendiri adalah tidak memerlukan konfigurasi (zero configuration), databasenya hanya disimpan dalam sebuah file, dan ukuran yg kecil (kurang dari 500KB). Karakteristik inilah yg membuat SQLite banyak digunakan sebagai solusi penyimpanan data pada perangkat dengan resource terbatas dan platform seperti Android, iOS, dan Blackberry.

Pembuatan Database


Kita mulai tentunya dengan membuat database. Android sudah menyediakan class bantuan bernama SQLiteOpenHelper yg akan membantu kita dalam pembuatan database, pembuatan tabel, dan pembaharuan skema pada tabel.

Ada 2 method yg perlu kita implementasikan yaitu onCreate dan onUpgrade, dan juga method constructor. Pada method constructor kita berikan parameter berupa nama dan versi database.


Database akan dibuat saat object dari SQLiteOpenHelper dibuat (instantiate) dan selanjutnya memanggil method getWritableDatabase.


Compile dan jalankan aplikasinya, lalu buka Android Device Monitor maka anda akan mendapati bahwa database sudah terbuat.


Anda dapat mengunduh file database tersebut ke laptop/desktop anda dengan menggunakan tombol “Pull a file from the device” yg terletak pada sudut kanan atas. Anda dapat membukanya dengan program seperti SQLite Professional utk melihat isinya.

Desain Database


Let say kita ingin membuat aplikasi daftar tugas. Maka skema pada tabel akan kurang lebih seperti berikut:

nama_tugas status_selesai
antar anak sekolah sudah
beli susu anak yg masih bayi sudah
nulis blog belum

Ingat method onCreate diatas?. Saya jelaskan sebelumnya bahwa method ini dapat anda gunakan untuk membuat skema pada tabel. Jadi seharusnya jika anda melakukan eksekusi perintah SQL berikut ini, maka table akan terbuat:

create table daftar_tugas_ku (‘nama_tugas' text, ‘status_selesai' integer)







Tetapi nyatanya tidak demikian. Jika sekarang anda buka lagi databasenya dengan SQLite Professional, maka anda akan mendapati bahwa tabel tidak terbentuk sebagaimana mestinya. Mengapa demikian?


Ini terjadi karena method onCreate hanya akan dijalankan sekali saat database dibuat pertama kali. Sementara karena saat ini kita telah menjalankan aplikasi untuk kedua kalinya dan database telah terbuat maka onCreate tidak dipanggil lagi oleh system android.

:-) Ya, saya sengaja menjebak anda :-)

Lalu bagaimana solusinya? Anda dapat mengulang dari awal dengan meng-uninstall aplikasi dan meletakkan statemen SQL pada method onCreate sehingga skema tabel akan di-inisialisasi pada saat database dibuat.

Solusi kedua, jika anda tidak ingin mengulang dari awal adalah dengan menggunakan method onUpgrade. Tetapi method ini tidak akan terpanggil apabila versi database tetap sama, oleh karena itu mari kita ubah versi database. Jika tadi kita set versi-nya dengan nilai “1” sekarang mari kita ubah menjadi “2”.















Jika anda jalankan lagi sekarang maka seharusnya skema tabel sudah terbentuk sesuai keinginan kita.


Data Entry


Untuk melakukan manipulasi pada database ada harus terlebih dahulu mendapatkan referensi ke objek SQLiteDatabase. Untuk itu anda dapat menggunakan method getWritableDatabase atau getReadableDatabase tergantung kebutuhan.

Selanjutnya anda dapat menggunakan execSQL utk meng-eksekusi perintah SQL.






































Namun membuat perintah SQL seperti ini dengan menggabungkan string dan parameter input sangatlah tidak disarankan karena pastinya akan sering terjadi kesalahan syntax SQL (contoh: kurang tanda petik, dll)

Oleh karena itu dianjurkan untuk menggunakan insert & ContentValues sebagai alternatif yg lebih baik. ContentValues berupa map dengan nama kolom sebagai key dan nilai kolom sebagai value.












































Query Database


Sama halnya dengan insert, ada dua cara yg dapat digunakan untuk melakukan query pada database. Yg pertama adalah dengan menggunakan rawQuery namun pastinya akan sangat rentan terhadap kesalahan.


Sebagai alternatif, android menyediakan query pada object SQLiteDatabase dengan parameter yg cukup panjang tetapi dapat meminimalisasi kesalahan pembuatan perintah SQL secara manual. Paremeter pertama tentunya adalah tabel yg menjadi target, parameter kedua adalah array dari nama kolom yg akan di ambil datanya, parameter ketiga & ke-empat merupakan kriteria pencarian yg masing-masing berupa nama kolom dan nilainya, dan yg seterusnya berkaitan dengan grouping & sorting dimana anda dapat mengabaikannya dengan memberikan nilai null jika tidak diperlukan.

Contoh, misal anda ingin mendapatkan data daftar tugas diseleksi berdasarkan status yg sudah selesai, maka anda dapat menggunakannya seperti berikut:


Jika anda perhatikan, method ini meng-hasilkan objek Cursor. Sama halnya seperti tabel, Cursor mempunyai baris dan kolom. Untuk mengambil data hasil pencarian anda gunakan moveToFirst dan moveToNext untuk iterasi baris dikombinasikan dengan getString, getInt, getLong, getShort, getFloat, getDouble (tergantung tipe data kolom) untuk mendapat nilai dari kolom pada baris tersebut.







Antarmuka Aplikasi


Rasanya kurang lengkap, membahas materi android tanpa menjelaskan bagaimana semua ini dikaitkan dengan antarmuka aplikasi. Biasanya saat kita mempunyai dataset yg berupa array, kita menggunakan ArrayAdapter untuk men-display nya didalam ListView. Tetapi pada kasus ini data kita adalah berupa Cursor objek. Tidak perlu khawatir karena android sudah menyediakan CursorAdapter untuk menampilkan data dari Cursor.

Penggunaan CursorAdapter sendiri tidak jauh berbeda dengan ArrayAdapter. Jika saat menggunakan ArrayAdapter, kita memberikan implementasi getView pada subclass kita, dalam pembuatan CursorAdapter, kita diharuskan menyediakan implementasi dari method newView dan bindView. Konsepnya tetap sama pada kedua method ini kita membuat sebuah view yg akan nantinya menjadi view yg men-display item pada list. Perbedaannya terletak pada newView digunakan untuk meng-inflate view sedangkan bindView digunakan untuk setting data pada view.

Ok, mari lihat contoh penggunaannya. Saya buat class baru sebagai subclass dari CursorAdapter dan meng-override method bindView dan newView.
























Lalu saya memakainya di MainActivity.


Tetapi pada saat saya jalankan, saya dapatkan error seperti dibawah ini:


Ternyata jika ingin memakai CursorAdapter, salah satu requirementnya adalah skema database kita harus mempunya kolom bernama _id. Ini dijelaskan juga didokumentasi dari CursorAdapter sendiri (http://developer.android.com/reference/android/widget/CursorAdapter.html)

The Cursor must include a column named "_id" or this class will not work

Untungnya kita dapat mengakali ini, dengan mengganti query kita seperti berikut tanpa harus mengubah skema database:


Sekarang, pada saat saya jalankan lagi aplikasi berjalan sebagai mana mestinya.


Cukup sekian dulu, mudah-mudahan bermanfaat bagi rekan-rekan sekalian. Terima kasih.

Sumber:
- Head First Android Development, Jonathan Simon, O’Reilly Media
- http://www.sqlite.org/footprint.html
- http://stackoverflow.com/questions/3359414/android-column-id-does-not-exist

No comments:

Post a Comment