Yup bersama saya lagi bermain-main dengan Android! Kali ini saya ingin membahas tentang
SharedPreferences dan
SQLite sebagai pilihan untuk
menyimpan data pada Android.
Pembuat aplikasi Android pasti suatu saat akan menemui suatu permasalahan tentang penyimpanan data. Bagaimana cara menyimpan data? Bagaimana data itu disimpan? Dimana harus disimpan? Jawaban dari pertanyaan itu dapat dijawab dengan membaca tutorial Android
disini. Menurut saya tutorial itu sudah cukup memberikan pengantar yang cukup untuk memulai merambah dunia simpan-menyimpan di Android (sehubungan dengan simpan-menyimpan, saya jadi ingat dengan "simpanan" saya. Tapi itu untuk lain cerita).
Apabila si pembuat aplikasi ini sudah mulai
advance, ia akan mulai bingung antara "apakah saya harus menggunakan
SharedPreferences atau kah saya harus menggunakan
SQLite?" dengan asumsi kita tidak memperdulikan penyimpanan di
storage (internal maupun eksternal). Karena sudah dipastikan penyimpanan di
storage itu lambat (akan disinggung sedikit nanti mengapa penyimpanan di
storage itu lambat). Seperti kita ketahui,
SharedPreferences hanya dapat menyimpan data dalam bentuk
key-value pair sehingga mudah dimodifikasi. Sedangkan
SQLite hanya dapat diubah dengan membuat
query SQL.
|
Ini ngomongin apa sih? Saya maunya pake Hadoop saja >:) |
Di sebuah post di
StackOverflow sudah dibahas tipe penyimpanan mana yang harus anda gunakan pada suatu kondisi tertentu. Inti dari post itu adalah: Gunakan
SharedPreferences bila
data-nya kecil dan
bermacam-macam. Gunakan
SQLite bila
data-nya besar,
terstruktur dan
sedikit macam-nya. Contoh data yang ingin anda simpan di
SharedPreferences adalah: "opsi apakah user ingin mendapatkan notifikasi", "opsi apakah user hanya ingin mengunduh data dari internet ketika terhubung dengan
wireless", "berapa kali notifikasi harus dilakukan tiap hari" dan berbagai macam data yang kecil yang lain. Contoh data yang ingin anda simpan di
SQLite adalah: "daftar manga yang di bookmark oleh user", "
contact list", "kumpulan teman-teman yang baru saja saya miss-call" dan berbagai macam data yang terstruktur yang lain.
Namun anda yang suka bermain Javascript atau fanatik dengan JSON akan berargumen: "
Bitch please! Saya bisa
mengubah data saya, misalnya Manga,
menjadi sebuah
JSON lalu saya
simpan ke
SharedPreferences. Manga saya nanti punya sebuah
key, misal URL darimana Manga tersebut diambil, untuk
mendapatkan Manga yang saya mau dari
SharedPreferences dengan mudah. Solusi ini mudah dibuat dan sangat mudah dikembangkan! Semua-nya jadi rata ke
SharedPreferences! Screw SQL!"
|
JSON can save the world! JSON can even kill and fight Freddy! |
Baik saya sangat setuju bahwa dengan
SharedPreferences pasti perlu digunakan (untuk
setting, konstanta-konstanta kecil, menyimpan versi terakhir yang digunakan, menyimpan waktu update dari internet terakhir kali, dan lain sebagainya). Sedangkan seperti yang telah disebutkan diatas,
SQLite tidak sepenuhnya dibutuhkan dengan alasan struktur yang kita butuhkan dapat dikompres dengan mudah kedalam JSON lalu kita simpan sebagai
String biasa. Tapi bagaimana kalau kita tinjau dari segi performa?
Pertama
SharedPreference akan makin lambat seiring dengan banyak-nya data yang disimpan dalam
SharedPreference tersebut. Lambat disini hanya terjadi saat aplikasi mulai dijalankan. Misal anda menyimpan segala sesuatu di
SharedPreference SPMangaMobile. Maka suatu saat apabila terlalu banyak Manga yang anda simpan di SPMangaMobile ini, untuk bisa me-load opsi-opsi trivial seperti "kapan terakhir kali aplikasi ini di-update" akan memakan waktu sangat lama. Samsung Galaxy Mini saya merasakan 5 detik startup hanya untuk memulai aplikasi karena saya menggunakan cara ini.
"Kalau begitu, pisahkan saja
SharedPreference yang bersifat struktural, seperti Manga, ke
SPManga. Sedangkan untuk yang lain, masukkan ke
SPMangaMobile."
In a way, solusi ini cukup benar sampai anda punya 1 MegaByte data. Me-load 300kB data saja membutuhkan waktu hingga hampir 1200 ms! Dan ini dilakukan di Android yang tidak sembarangan:
Galaxy Tab 8.9" dengan processor Tegra 2 dual core 1 GHz! Bayangkan berapa lama waktu yang dibutuhkan di Galaxy Mini?
|
Tiap kali pengguna memulai aplikasi, pengguna harus menunggu selama 516 ms untuk mempersiapkan SharedPreferences. Another 720 ms untuk mendapatkan data yang dibutuhkan.
|
|
Selebihnya program menghabiskan rata-rata 720ms untuk mengolah data hingga dapat digunakan. |
|
Wow. Pengguna Android sekarang pasti akan mulai membanting HP-nya apabila HP-nya berhenti me-respon dalam waktu lebih dari 3 detik (ya, pengguna Android se-tidak-sabaran itu). "Nexus gw gak mungkin selambat itu! Yang lambat itu cuma BB!" Baik, coba tunjukkan waktu yang dibutuhkan bila menggunakan SQLite! Segera komandan!
|
3685 ms adalah waktu yang dibutuhkan untuk mem-backup database ke eksternal storage (karena itu saya bilang menyimpan di storage itu lambat). Hal ini hanya dilakukan sekali saja setiap kali anda mengubah definisi database (misal menambah kolom pada suatu tabel). Jika anda pintar, database hanya perlu dibuat sekali saja :)
|
|
Loh tapi ternyata performa-nya tidak berkembang sama sekali! Penipuan ini namanya! |
|
Ya, bisa anda lihat bahwa performa menggunakan
SQLite tidak berbeda jauh dari menggunakan
SharedPreference. Lalu apa gunanya donk kita menggunakan
SQLite? Tunggu dulu! Mari kita simak lagi.
Berbeda dengan apabila kita menggunakan JSON terstruktur pada
SharedPreferences, pada SQLite kita bisa mengambil data-data yang kita perlukan saja (dengan menspesifikasikan
query yang tepat). Misalnya untuk kasus ini, saya hanya ingin mengambil
judul,
url, dan
rating dari suatu
Manga. Saya tidak peduli dengan
deskripsi,
genre, maupun data-data yang lain. Tentu hal ini bisa meningkatkan performa! Tapi sebesar apa? Mari kita lihat!
|
Karena sudah di-backup sebelumnya, kali ini kita hanya melihat waktu yang dihabiskan oleh aplikasi untuk menyiapkan data yang siap ditampilkan. |
|
Yes! Akhirnya peningkatan performa! Kali ini aplikasi dapat me-load data dalam waktu hanya 231ms saja! Tiga kali lebih cepat dibandingkan sebelumnya!
Dari percobaan ini saya kembali ke kesimpulan yang sebelumnya telah dibuat oleh suatu post di
StackOverflow :
Gunakan SharedPreferences bila data-nya kecil dan bermacam-macam. Gunakan SQLite bila data-nya besar, terstruktur dan sedikit macam-nya.
Sekian dari saya. Seperti biasa, komentar dan tanggapan sangat diterima :)
No comments:
Post a Comment