Tugas ini dikerjakan untuk memenuhi tugas dari matakuliah Mobile Programing ke-8 pada
Semester empat (4)
Disusun Oleh :
Kurnia Sandi (1164042)
Kelas:
D4TI2B
Dosen Matakuliah :
M. Harry K. Saputra, S.T., M.T.
i
KATA PENGANTAR
Puji syukur kehadirat Allah swt. yang telah melimpahkan rahmat, taufiq serta hidayah-
Nya sehingga saya dapat menyelesaikan penyusunan makalah ini tepat pada waktunya. Banyak
kendala dalam penyusunan makalah ini, mulai dari pengumpulan data, pembuatan tutorial serta
penyusunan tiap data dan informasi yang telah di peroleh ke dalam makalah.
Dalam penyusunan makalah ini, saya berharap kritik dan saran yang bersifat
membangun sebagai masukan untuk kelengkapan makalah ini. Sekali lagi, saya ucapkan
terimakasih.
Penyusun
Kurnia Sandi
ii
DAFTAR ISI
COVER ...………………………………………………………………………………………i
KATA PENGANTAR ...............................................................................................................ii
3.1 Kesimpulan................................................................................................................ 46
iii
BAB I
PENDAHULUAN
Pengguna platform Android sebagai Sistem Operasi untuk mobile semakin meroket di
pasaran. Berdasarkan laporan Net Market Share yang dirangkum KompasTekno via
Windowslatest, Senin (8/10/2018), sistem operasi Android memiliki populasi 68,39 persen dari
total keseluruhan OS mobile di dunia pada tahun 2017. Hal ini sungguh pencapaian terbesar
bagi perusahaan pemegang Android.
Android adalah OS open source yang dikembangkan oleh Google untuk dapat digunakan
oleh semua orang. Google juga memberikan kebebasan kepada para developer untuk membuat
dan mengembangkan software berbasis Android sesuai kebutuhkan mereka.
Software Android Studio terdapat banyak komponen yang kita gunakan, contohnya seperti
penggunaan SQLite dan Sharing Data With Content Provider.
Oleh karena itu, dalam makalah ini akan dibahas sejumlah kompoonen yang telah
disebutkan di atas secara sederhana dan mudah dipahami.
Dalam makalah ini terdapat empat(4) masalah yang akan dibahas, yaitu sebagai berikut:
1
1.3 Tujuan Penyusunan
Berdasarkan rumusan masalah di atas, maka tujuan dibuatnya makalah ini yaitu sebagai
berikut:
Dalam penyusunan makalah ini ada manfaat yang dapat diambil yaitu mengetahui apa itu
Preferences and Setting, Storing Data Using SQLite, Sharing Data With Content Providers
dan Loading Data Loaders.
2
BAB II
ISI
3
1. Daftar Rangkuman Fakta Tentang Setiap Ruang Penyimpanan
2. Penyimpanan Internal
Ketika menyimpan file, kita tidak memerlukan izin apa pun penyimpanan
internal. Aplikasi dalam mode ini selalu memiliki izin untuk membaca dan menulis
file dalam direktori penyimpanan internalnya.
Untuk membuat file baru di salah satu direktori ini, Kita bisa menggunakan
konstruktor File():
4
Atau, jika kita perlu menyimpan beberapa file ke cache, lebih baik gunakan
createTempFile(). Misalnya, metode berikut akan mengekstrak nama file dari URL
dan membuat file dengan nama itu dalam direktori cache internal aplikasi kita:
3. Penyimpanan Eksternal
Ketika file yang harus disimpan secara permanen maka gunakan penyimpanan
eksternal, bahkan jika aplikasi kita dicopot pemasangannya, dan tersedia bebas
untuk pengguna dan aplikasi lainnya, seperti foto, gambar, atau dokumen yang
dibuat oleh aplikasi.
Beberapa file privat yang tidak memiliki nilai bagi aplikasi lain juga bisa
disimpan pada penyimpanan eksternal. File semacam itu bisa berupa sumber daya
aplikasi tambahan yang telah diunduh, atau file media sementara.
5
Direktori privat yang khusus untuk aplikasi. Setiap pohon file ini memiliki tiga
direktori yang diidentifikasi melalui konstanta sistem.
Misalnya, setiap file yang kita simpan ke dalam direktori nada dering publik
DIRECTORY_RINGTONES akan tersedia untuk semua aplikasi nada dering
lainnya.
Sebaliknya, setiap file yang kita simpan dalam direktori nada dering privat
DIRECTORY_RINGTONES, secara default, hanya bisa dilihat oleh aplikasi dan
akan dihapus bersama aplikasi.
Kita tidak harus memeriksa jumlah ruang yang tersedia sebelum menyimpan
file. Sebagai gantinya, kita dapat langsung mencoba menulis file, kemudian
menangkap IOException jika terjadi. Kita mungkin perlu melakukannya jika tidak
mengetahui secara persis jumlah ruang yang diperlukan.
6
8. Menghapus File
Pada aplikasi, ada saatnya kita harus mengahapus beberapa file. Cara paling
cepat untuk menghapus file adalah membuat referensi file yang telah dibuka dengan
memanggil delete() pada dirinya sendiri.
Jika file disimpan pada penyimpanan internal, Kita juga bisa meminta Context
untuk menemukan dan menghapus file dengan memanggil deleteFile():
Sebagai user yang baik, kita juga seharusnya secara teratur menghapus file
cache yang dibuat dengan getCacheDir().
9. Database SQLite
Menyimpan data ke database cocok untuk data terstruktur atau berulang,
misalnya informasi kontak. Android menyediakan database seperti-SQL untuk
keperluan tersebut.
1) java.net.*
2) android.net.*
7
12. Firebase
Firebase adalah platform seluler yang membantu kita mengembangkan
aplikasi, menumbuhkan basis pengguna, dan menghasilkan uang lebih banyak.
Firebase terdiri dari beberapa fitur pelengkap yang bisa dipadupadankan sesuai
dengan kebutuhan kita.
8
2. Membuat File Berbagi Preferensi
Dalam satu aplikasi kita hanya dapat membuat satu shared preferences file, dan
biasanya diberi nama dengan nama paket aplikasi. Hal ini membuat namanya unik
dan mudah dikaitkan dengan aplikasi kita.
Dalam membuat file shared preferences dengan metode onCreate() pada main
activity dan menyimpannya dalam sebuah variabel.
Diperlukan argumen mode, karena Android versi lama memiliki mode lain yang
memungkinkan kita membuat file shared preferences yang bisa dibaca dan ditulis
secara public. Mode ini tidak digunakan lagi di API 17, dan sekarang sangat tidak
dianjurkan karena alasan keamanan. Jika kita perlu berbagi data dengan aplikasi
lainnya, gunakan layanan atau content provider.
9
Kita tidak perlu mengkhawatirkan life cycle dari komponen Android dan
interaksinya dengan penulisan apply() ke disk. Framework memastikan
penulisan disk yang sedang diakses dari apply() selesai sebelum mengubah
keadaan.
4. Restoring Shared Preferences
Ketika memulihkan shared preferences dalam activity dengan method
onCreate(). Metode get() mengambil dua argument. Satu untuk kunci dan satu
lagi untuk nilai default jika kunci tidak bisa ditemukan. Dengan menggunakan
argumen default, kita tidak perlu menguji apakah preferensi ada dalam file.
Kita bisa mengkombinasikan panggilan untuk put dan clear. Akan tetapi, saat
menerapkan preferensi, clear selalu dilakukan terlebih dahulu, tanpa menghiraukan
apakah kita memanggil method clear sebelum atau setelah method put pada editor
ini.
10
tersebut untuk objek Shared Preferences dengan memanggil
registerOnSharedPreferenceChangeListener().
Dalam contoh ini, method akan memeriksa apakah setelan yang diubah adalah
untuk kunci preferensi yang diketahui. Hal tersebut akan memanggil
findPreference() untuk mendapatkan objek Preference yang diubah agar bisa
memodifikasi rangkuman item menjadi keterangan pilihan pengguna.
Untuk pengelolaan life cycle yang tepat dalam activity, daftarkan dan cabut
pendaftaran SharedPreferences.OnSharedPreferenceChangeListener Kita, masing-
masing selama callback onResume() dan onPause():
11
7. Hold a reference to the listener
Bila kita memanggil registerOnSharedPreferenceChangeListener(), pengelola
preferensi saat ini tidak akan langsung menyimpan referensi ke listener. Kita harus
menahan referensi ke listener, atau referensi akan rentan terhadap pengumpulan
sampah. Pertahankan referensi ke listener dalam data instance suatu objek yang
akan ada selama Kita memerlukan listener.
12
Atur default untuk kontrol setelan kita yang familier bagi pengguna dan perbaiki
pengalaman aplikasi. Adapun nilai default awal untuk setelan harus:
13
2. Setelan di menu opsi bilah aplikasi
3. Mengatur UI
UI seharusnya tesusun rapi, bisa diprediksi, dan berisi jumlah pilihan yang bisa
dikelola. Pengguna harus bisa memahami dengan cepat semua setelan yang tersedia
dan nilainya saat ini. Ikuti panduan desain ini:
7 setelan atau kurang: Susun setelan sesuai dengan prioritas, yang paling
penting berada di bagian atas.
7-15 setelan: Kelompokkan setelan terkait di bawah pembatas bagian.
Misalnya, dalam gambar di bawah, "Priority interruptions" dan "Downtime
(priority interruptions only)" adalah pembatas bagian.
14
16 setelan atau lebih: Kelompokkan setelan terkait ke dalam sub-layar
tersendiri. Gunakan judul, seperti Tampilan pada layar Setelan utama (seperti
yang ditampilkan pada sisi kiri gambar di bawah) untuk memungkinkan
pengguna mengarahkan ke setelan tampilan (ditampilkan pada sisi kanan
gambar di bawah):
Setiap Preference muncul sebagai suatu item dalam daftar. Subkelas langsung
menyediakan kontainer untuk layout yang melibatkan beberapa setelan. Misalnya:
15
PreferenceScreen Menyatakan Preference tingkat atas yang merupakan akar
hierarki Preference. Gunakan PreferenceScreen dalam layout di bagian atas
setiap layar setelan.
Definisikan daftar setelan Kita dalam XML, dengan menyediakan struktur yang
mudah dibaca dan mudah diperbarui. Setiap subkelas Preference bisa dideklarasikan
bersama elemen XML yang cocok dengan nama kelas, misalnya:
16
Akar hierarki setelan adalah layout PreferenceScreen :
17
default untuk setelan aplikasi Kita.
18
o Teks untuk tombol radio (Always, When possible, dan Never)
didefinisikan dalam larik pref_example_list_titles dan ditetapkan oleh
atribut android:entries .
o Nilai untuk pilihan tombol radio didefinisikan dalam larik
pref_example_list_values dan ditetapkan oleh atribut
android:entryValues .
o Tombol radio ditampilkan dalam dialog, yang biasanya memiliki tombol
positif (OK atau Accept) dan negatif (Cancel). Akan tetapi, dialog setelan
tidak memerlukan tombol ini, karena pengguna bisa menyentuh bagian
luar dialog untuk menghilangkannya. Untuk menyembunyikan tombol
ini, setel atribut android:positiveButtonText dan
android:negativeButtonText ke "@null" .
6. Menampilkan Setelan
Gunakan subkelas Activity atau Fragmentt yang khusus untuk menampilkan
daftar setelan.
Untuk aplikasi yang mendukung Android 3.0 dan versi yang lebih baru,
praktik terbaik untuk setelan adalah menggunakan Settings Activity dan
Fragment untuk setiap file XML preferensi:
o Tambahkan kelas Settings Activity yang memperluas Activity dan
menjadi host Fragment yang memperluas PreferenceFragmentt.
o Agar tetap kompatibel dengan pustaka appcompat v7, perluas Settings
Activity dengan AppCompatActivity, perluas Fragment dengan
PreferenceFragmenttCompat.
19
Jika aplikasi Kita mendukung versi Android yang lebih lama dari 3.0 (API
level 10 dan yang lebih rendah), bangun Activity setelan khusus sebagai
ekstensi kelas PreferenceActivity.
Akan tetapi, untuk membuat layout dua-panel bagi layar besar bila Kita memiliki
beberapa grup setelan, Kita bisa menggunakan Activity yang memperluas
PreferenceActivity dan juga PreferenceFragmentt untuk menampilkan setiap daftar
setelan. Kita akan melihat pola ini dengan template Settings Activity seperti yang
nanti dijelaskan dalam bab ini di "Menggunakan template Settings Activity".
20
7. Menggunakan PreferenceFraggment
Seperti yang ditampilkan dalam kode di atas, kita mengaitkan setelan layout
XML dengan Fragment selama proses callback onCreatePreferences() dengan
memanggil setPreferencesFromResource() dengan dua argumen:
21
Kode di atas adalah pola umum yang digunakan untuk menambahkan Fragment
ke sebuah activity sehingga Fragment muncul sebagai materi utama activity. Kita
menggunakan:
Jika kita mengimplementasikan menu opsi dengan item Settings, gunakan cara
berikut untuk memanggil Settings Activity dengan metode onOptionsItemSelected()
bila pengguna mengetuk Settings (menggunakan action_settings untuk ID sumber
daya menu Settings):
22
9. Mengatur Nilai Default Untuk Setelan
Jika pengguna mengubah setelan, sistem akan menyimpan perubahan ke file
SharedPreferences. Seperti yang telah Kita pelajari dalam pelajaran lain, preferensi
bersama memungkinkan Kita membaca dan menulis data primitif dalam jumlah kecil
sebagai pasangan key/value ke file pada penyimpanan perangkat.
1) Pastikan untuk menetapkan nilai default untuk setiap setelan dalam file XML
dengan menggunakan atribut android:defaultValue :
23
menyetel ulang ke nilai defaultnya. Akan tetapi, jika kita menyetelnya ke
true, method akan menggantikan nilai-nilai sebelumnya dengan default.
10. Membaca Nilai Settings
Semua preferensi aplikasi disimpan secara default ke file yang bisa diakses dari
mana saja dalam aplikasi dengan memanggil method statis
PreferenceManager.getDefaultSharedPreferences(). Method ini membutuhkan
konteks dan mengembalikan objek SharedPreferences berisi semua pasangan nilai-
kunci yang dikaitkan dengan objek Preference.
Misalnya, baris kode berikut menampilkan lalu membaca salah satu nilai
preferensi dari method onCreate() main activity:
24
1.2 Storing Data Using SQLite
25
o DATABASE_NAME
Kita bisa menemukan apa yang ada dalam baris tertentu menggunakan _id,
atau bisa mengambil baris dengan merumuskan kueri yang memilih baris
dari tabel yang menetapkan pembatas. Gunakan bahasa SQL untuk
perintahnya.
4. Transaksi
Transaksi adalah urutan operasi yang dijalankan sebagai satu unit kerja logis. Unit
kerja logis harus menunjukkan empat properti, yaitu properti atomisitas, konsistensi,
isolasi, dan ketahanan (ACID), untuk memenuhi syarat sebagai transaksi.
Semua perubahan dalam satu transaksi di SQLite diterapkan pada semua bagian
(atau tidak diterapkan sama sekali), bahkan jika tindakan menulis perubahan ke disk
terputus karena:
program mogok,
sistem operasi mogok, atau
listrik mati.
Contoh transaksi:
Mengirimkan uang dari rekening tabungan ke rekening giro.
Memasukkan suatu istilah dan definisi ke dalam kamus.
Mengikat changelist ke cabang utama.
o ACID
- Atomisitas. Semua modifikasi data dijalankan, atau tidak ada yang
dijalankan.
- Konsistensi. Bila selesai, suatu transaksi harus meninggalkan semua
data dalam keadaan konsisten.
- Isolasi. Modifikasi yang dibuat oleh transaksi yang terjadi bersamaan
harus diisolasi dari modifikasi yang dibuat oleh transaksi lainnya. Suatu
transaksi mengenali data baik dalam keadaan sebelum transaksi
bersamaan dan lainnya lalu memodifikasinya, maupun mengenali data
26
setelah transaksi kedua selesai, namun tidak mengenali keadaan di
antara keduanya.
- Ketahanan. Setelah transaksi selesai, efeknya diterapkan permanen
dalam sistem. Modifikasi tetap ada bahkan sekitainya listrik mati.
5. Bahasa Kueri
Kita menggunakan bahasa kueri SQL khusus untuk berinteraksi dengan database.
Kueri bisa sangat kompleks, namun operasi dasarnya :
menyisipkan baris
menghapus baris
memperbarui nilai dalam baris
mengambil baris yang memenuhi kriteria tertentu
Di Android, objek database menyediakan metode praktis untuk menyisipkan,
menghapus, dan memperbarui database. Untuk itu, kita hanya perlu memahami struktur
dan baris dari kode SQL untuk memproses data tersebut.
6. Struktur Queri
Kueri SQL sangat terstruktur dan terdiri atas bagian dasar berikut:
SELECT kata, keterangan FROM WORD_LIST_TABLE WHERE
kata="alpha"
Versi generik kueri :
SELECT kolom FROM tabel WHERE kolom="value"
Bagian:
SELECT kolom—memilih kolom untuk dikembalikan. Gunakan * untuk
mengembalikan semua kolom.
FROM tabel—menetapkan tabel yang dipakai untuk mendapatkan hasil.
WHERE—kata kunci untuk ketentuan yang harus terpenuhi.
kolom="value"—ketentuan yang harus dipenuhi.
o operator umum: =, LIKE, <, >
AND, OR—menghubungkan beberapa ketentuan dengan operator logika.
ORDER BY—mengabaikan urutan default, atau menetapkan ASC untuk
menaik, DESC untuk menurun.
LIMIT adalah kata kunci yang sangat berguna jika Kita ingin mendapatkan
jumlah hasil yang terbatas.
7. Contoh Query
27
8. Query untuk Android SQLite
Kita bisa mengirimkan kueri ke database SQLite sistem Android sebagai kueri
mentah atau sebagai parameter.
rawQuery(String sql, String[] selectionArgs) menjalankan SQL yang
disediakan dan mengembalikan Cursor rangkaian hasil.
Tabel berikut menampilkan bagaimana dua kueri pertama dari hal di atas akan
terlihat sebagai kueri mentah.
Mengembalikan:
28
9. Kursor
Kueri selalu mengembalikan objek Cursor. Cursor adalah interface objek yang
menyediakan akses baca-tulis acak ke rangkaian hasil yang dikembalikan oleh kueri
database. Kursor menunjuk ke elemen pertama pada hasil kueri.
Kursor adalah pointer ke dalam baris data terstruktur. Kita bisa menganggapnya
sebagai pointer ke baris tabel.
Kelas Cursor menyediakan metode untuk menggerakkan kursor melalui struktur
terkait, dan metode untuk mendapatkan data dari kolom setiap baris.
Bila metode mengembalikan objek Cursor, Ulangi hasil, ekstrak data, lakukan
sesuatu dengan data, dan terakhir tutuplah kursor untuk membebaskan memori.
29
SQLiteOpenHelper yang akan mengeksekusi permintaan dan mengelola database untuk
Kita. Aplikasi hanya boleh berinteraksi dengan SQLiteOpenHelper.
Ada dua tipe data yang dikaitkan secara khusus dengan penggunaan database
SQLite, yaitu Cursor dan ContentValues.
1. Cursor
SQLiteDatabase selalu menyajikan hasil berupa Cursor dalam format tabel yang
menyerupai database SQL.
Kita bisa menganggap data sebagai larik baris. Kursor adalah pointer ke dalam satu
baris data terstruktur. Kelas Cursor menyediakan metode untuk menggerakkan kursor
melalui struktur data, dan metode untuk mendapatkan data dari bidang ke bidang di
setiap baris.
Kelas Cursor memiliki sejumlah subkelas yang mengimplementasikan kursor untuk
tipe data tertentu.
SQLiteCursor mengekspos hasil kueri dari sebuah SQLiteDatabase.
SQLiteCursor tidak disinkronkan secara internal, sehingga kode yang
menggunakan SQLiteCursor dari beberapa thread harus melakukan sinkronisasi
saat menggunakan SQLiteCursor.
MatrixCursor adalah implementasi kursor lengkap namun tidak tetap, yang
didukung oleh larik objek yang secara otomatis meluaskan kapasitas internal
bila diperlukan.
Beberapa operasi yang umum pada kursor adalah:
getCount() mengembalikan jumlah baris dalam kursor.
getColumnNames() mengembalikan larik string yang berisi nama semua kolom
dalam rangkaian hasil dalam urutan pencantumannya dalam hasil.
getPosition() mengembalikan posisi kursor saat ini dalam rangkaian baris.
Getter tersedia untuk tipe data tertentu, seperti getString(int column) dan
getInt(int column).
Operasi seperti moveToFirst() dan moveToNext() akan menggerakkan kursor.
close() membebaskan semua sumber daya dan membuat kursor menjadi tidak
valid sama sekali. Ingat untuk menutup panggilan guna membebaskan sumber
daya!
30
2. Memproses Kursor
Jika panggilan method return looping pada hasil, ekstrak data, lakukan sesuatu
dengan data, dan terakhir, harus menutup kursor untuk membebaskan memori. Jika
tidak dilakukan, aplikasi bisa mogok saat kehabisan memori.
Kursor dimulai sebelum baris hasil pertama, sehingga pada pengulangan pertama
gerakkan kursor ke hasil pertama jika ada. Jika kursor kosong, atau baris terakhir sudah
diproses, maka akan keluar dari loop. Jangan lupa menutup kursor bila Kita selesai
menggunakannya. (Ini tidak boleh diulang terlalu sering.)
4. Operasi Database
Walaupun bisa memanggil metode dalam open helper yang diinginkan dan
mengembalikan yang Kita pilih ke Activity pemanggil, lebih baik lanjutkan dengan
metode query(), insert(), delete(), update(), count() stkitar yang sesuai dengan API
database dan content provider. Menggunakan format ini akan mempermudah
31
penambahan content provider atau pemuat di masa mendatang, dan memudahkan orang
lain dalam memahami kode Kita.
Diagram berikut menampilkan cara mendesain API yang berbeda agar konsisten
dan jelas.
Query()
Metode kueri yang diimplementasikan dalam kelas open helper bisa mengambil
dan mengembalikan tipe data apa pun yang diperlukan user interface.
Karena open helper menyediakan metode praktis untuk menyisipkan,
menghapus, dan memperbarui baris.
Secara umum, metode kueri hanya boleh mengizinkan kueri yang diperlukan
oleh aplikasi dan bukan untuk keperluan umum.
Database menyediakan dua metode untuk mengirimkan kueri:
SQLiteDatabase.rawQuery() dan SQLiteDatabase.query(), bersama sejumlah opsi
untuk argumen.
o SQLiteDatabase.rawQuery().rawQuery()
Metode kueri open helper bisa membentuk kueri SQL dan mengirimkannya
sebagai rawQuery ke database yang mengembalikan kursor. Jika data
disediakan oleh aplikasi dan dikontrol penuh, Kita bisa menggunakan
rawQuery().
32
o SQLiteDatabase.query()
Jika Kita memproses data yang disediakan user, bahkan setelah validasi,
lebih aman membentuk kueri dan menggunakan versi metode
SQLiteDatabase.query() untuk database. Argumen adalah apa yang kita
harapkan dalam SQL dan didokumentasikan dalam dokumentasi
SQLiteDatabase.
Insert()
Metode insert() open helper memanggil SQLiteDatabase.insert(), yaitu metode
SQLiteDatabase praktis yang digunakan untuk menyisipkan baris ke dalam
database. (Metode ini praktis, karena kita tidak perlu menulis kueri SQL sendiri.)
o Format :
33
- Argumen ketiga harus berupa kontainer [ContentValues] bersama nilai-
nilai untuk mengisi baris. Contoh ini hanya memiliki satu kolom; untuk
tabel dengan banyak kolom, tambahkan
- Metode database mengembalikan ID item yang baru disisipkan, dan Kita
harus meneruskannya ke aplikasi.
o Contoh
Delete()
Metode delete dari open helper memanggil metode delete() database, yang
praktis digunakan sehingga kita tidak perlu menulis kueri SQL seluruhnya.
o Format
Kita bisa menghapus menggunakan kriteria apa pun, dan metode akan
mengembalikan jumlah item yang sebenarnya dihapus, yang juga harus
dikembalikan oleh open helper.
o Contoh
Update()
Metode update dari open helper memanggil metode update() database, yang
praktis digunakan sehingga kita tidak perlu menulis kueri SQL seluruhnya.
Argumen tersebut sudah familier dari metode sebelumnya, dan onUpdate
mengembalikan jumlah baris yang diperbarui.
o Format
34
- Argumen ketiga adalah klausa WHERE.
- Argumen keempat adalah argumen untuk klausa WHERE.
o Contoh
Count()
Metode count() mengembalikan jumlah entri dalam database. Jika
menggunakan RecyclerView.Adapter, kita harus mengimplementasikan
getItemCount(), dan perlu mendapatkan sejumlah baris dari open helper serta perlu
didapat dari database.
o Di Adapter
o Di Open Helper
35
Agnostik terhadap repositori, yang mungkin melalui database, sistem file, atau
cloud.
36
1.3.4 Kegunaan Content Provider
Content provider berguna untuk aplikasi yang ingin menyediakan data bagi aplikasi
lain. Seperti:
Dengan content provider, kita bisa memungkinkan beberapa aplikasi lainnya
untuk mengakses, menggunakan, dan memodifikasi sumber data tunggal yang
disediakan oleh aplikasi. Contoh: Persediaan di gudang untuk toko retail, skor
game, atau kumpulan masalah fisika untuk universitas.
Untuk kontrol akses, kita bisa menetapkan tingkatan izin content provider, yang
menetapkan cara aplikasi lain bisa mengakses data. Misalnya, toko mungkin
tidak boleh mengubah data persediaan di gudang.
Kita bisa menyimpan data secara independen dari aplikasi, karena content
provider berada di antara user interface dan data yang disimpan. Kita bisa
mengubah cara data disimpan tanpa perlu mengubah kode yang berinteraksi
dengan pengguna. Misalnya, Kita bisa membangun prototipe aplikasi belanja
menggunakan data persediaan tiruan, kemudian menggantinya nanti dengan
database SQL untuk data sungguhan. Kita bahkan bisa menyimpan sebagian
data di sistem cloud serta sebagian lagi secara lokal, dan semua itu sama saja
bagi pengguna.
Manfaat lain memisahkan data dari user interface dengan content provider
adalah karena tim development bisa bekerja secara independen pada user
interface dan repositori data aplikasi Kita. Untuk aplikasi yang lebih besar dan
kompleks, umumnya user interface dan backend data dikembangkan oleh tim
yang berbeda, bahkan bisa berupa aplikasi terpisah; yakni, aplikasi dengan
content provider tidak harus memiliki user interface. Misalnya, aplikasi
persediaan bisa terdiri dari data dan content provider saja.
Ada kelas lain yang diharapkan berinteraksi dengan content provider. Misalnya,
Kita harus memiliki content provider untuk menggunakan loader, seperti
CursorLoader, untuk memuat data di latar belakang. Kita akan mempelajari
tentang loader di bab berikutnya.
37
1.3.5 Arsitektur Aplikasi dengan Content Provider
Data dan Open Helper: Repositori data. Data bisa berada dalam database, file,
internet, dihasilkan secara dinamis, atau bahkan campuran semua ini. Misalnya,
jika Kita memiliki aplikasi kamus, kamus dasar bisa disimpan dalam database
SQLite pada perangkat pengguna. Jika tidak ada dalam database, definisi bisa
diambil dari internet, dan jika gagal, aplikasi bisa meminta pengguna untuk
menyediakan definisi atau memeriksa ejaannya.
Data yang digunakan bersama content provider umumnya disimpan dalam
database SQLite, dan API content provider akan mencerminkan asumsi ini.
Contract: Kontrak adalah kelas publik yang mengekspos informasi penting
tentang content provider ke aplikasi lainnya. Kontrak biasanya menyertakan
skema URI, konstanta penting, dan struktur data yang akan dikembalikan.
Misalnya, untuk aplikasi persediaan topi, kontrak bisa mengekspos nama kolom
yang berisi harga serta nama produk, dan URL untuk mendapatkan item
persediaan berdasarkan nomor komponen.
Content Provider: Content provider memperluas kelas ContentProvider dan
menyediakan metode query(), insert(), update(), serta delete() untuk mengakses
data. Selain itu, content provider menyediakan antarmuka publik yang aman ke
data, sehingga aplikasi lainnya bisa mengakses data dengan izin yang sesuai.
Misalnya, untuk mendapatkan informasi dari database aplikasi Kita, aplikasi
topi retail akan menghubungkan dengan content provider, bukan dengan
database secara langsung, karena ini tidak diizinkan.
38
Aplikasi yang memiliki data akan menetapkan izin apa yang diperlukan aplikasi
lainnya untuk bekerja dengan content provider. Misalnya, jika memiliki aplikasi
yang menyediakan persediaan untuk toko retail, aplikasi Kita memiliki data dan
menentukan izin akses aplikasi lainnya ke data. Izin ditetapkan dalam Manifes
Android.
Content Resolver: Content provider selalu diakses melalui content resolver.
Anggaplah content resolver sebagai kelas helper yang mengelola semua detail
hubungan dengan content provider untuk Kita. Pencerminan API content
provider, objek ContentResolver memberi Kita metode query(), insert(),
update(), dan delete() untuk mengakses data content provider. Misalnya, untuk
mendapatkan semua item persediaan berupa topi merah, aplikasi toko merah
akan membangun kueri untuk topi merah, dan menggunakan content resolver
untuk mengirim kueri itu ke content provider.
1.3.6 Mengimplementasikan Content Provider
Dengan merujuk pada diagram sebelumnya, maka untuk mengimplementasikan
content provider, Kita perlu:
Data, misalnya, dalam sebuah database.
Cara untuk mengakses storage data, misalnya, melalui open helper untuk
database.
Deklarasi content provider dalam Android Manifes untuk menyediakannya bagi
aplikasi itu sendiri dan aplikasi lainnya.
Subkelas ContentProvider yang mengimplementasikan metode query(),
insert(), delete(), update(), count(), dan getType().
Kelas kontrak publik yang mengekspos skema URI, nama tabel, tipe MIME,
dan konstanta penting ke kelas dan aplikasi lainnya. Walaupun tidak wajib,
tanpa kelas ini, aplikasi lainnya tidak bisa mengetahui cara mengakses content
provider Kita.
Content resolver untuk mengakses content provider dengan menggunakan
metode dan kueri yang sesuai.
1.3.7 Izin Untuk Berbagi
Secara default, aplikasi tidak bisa mengakses data aplikasi lainnya. Kedua aplikasi
yang terlibat dalam berbagi data harus memiliki izin untuk melakukannya.
39
Content provider harus mengizinkan aplikasi lainnya untuk mengakses
datanya.
Pengguna harus mengizinkan aplikasi klien untuk mengakses content
provider.
Loader adalah kelas keperluan khusus yang mengelola pemuatan dan pemuatan ulang
asinkron di latar belakang dengan menggunakan AsyncTask.
Loader yang diperkenalkan di Android 3.0 memiliki karakteristik ini:
Loader tersedia untuk setiap Activity dan Fragmentt.
Loader menyediakan pemuatan data asinkron di latar belakang.
40
Loader memantau sumber data mereka dan secara otomatis mengirimkan hasil baru bila
konten berubah. Misalnya, jika kita menampilkan data dalam RecyclerView, saat data
yang mendasarinya berubah, CursorLoader secara otomatis memuat rangkaian data
yang telah diperbarui, dan bila pemuatan selesai, maka dapat memberikan notifikasi
kepada RecyclerView.Adapter untuk memperbarui apa yang ditampilkan kepada
pengguna.
Loader secara otomatis menghubungkan kembali ke kursor loader saat dibuat kembali
setelah perubahan konfigurasi. Karena itu, loader tidak perlu melakukan kueri ulang
datanya untuk ditampilkan kembali.
1. Loader Manager
LoaderManager adalah kelas praktis yang mengelola semua loader Kita. Kita hanya
perlu satu pengelola loader per aktivitas dan secara umum mendapatkannya pada
onCreate() aktivitas, tempat mendaftarkan loader yang akan Kita gunakan.
Pengelola loader menangani pendaftaran sebuah observer pada penyedia materi,
yang akan menerima callback bila data di penyedia materi berubah.
Satu-satunya panggilan untuk pengelola loader yang perlu Kita buat adalah untuk
mendaftarkan loader, dan memulainya lagi saat Kita harus membuang semua data yang
dimuat. Parameter pertama adalah ID loader, yang kedua adalah argumen opsional, dan
yang ketiga adalah konteks tempat callback didefinisikan.
2. LoaderManager.LoaderCallbacks
Untuk berinteraksi dengan loader, aktivitas Kita harus mengimplementasikan
serangkaian callback yang ditetapkan dalam antarmuka LoaderCallbacks dari
LoaderManager. Bila keadaan loader berubah, metode ini akan dipanggil karenanya.
Metode tersebut adalah:
onCreateLoader()—Dipanggil bila loader baru telah dibuat. Mengaitkan data
dengan sumber data yang harus dimuat dan diamatinya. (Kita tidak harus
melakukan tambahan apa pun bagi loader untuk mengamati sumber data.)
onLoadFinished()—Dipanggil setiap kali loader selesai memuat. Memicu
pembaruan data yang terlihat pengguna dalam metode ini.
42
onLoaderReset()—Bila loader disetel ulang, Kita biasanya ingin melakukan
invalidasi data yang saat ini ditahan hingga data baru dimuat.
Untuk mengimplementasikan callback ini, Kita perlu mengimplementasikan callback
LoaderManager untuk tipe loader yang dimiliki. Untuk loader kursor, ubah tkita tangan
aktivitas Kita seperti berikut, kemudian implementasikan callback.
onCreateLoader()
Callback ini membuat instance dan mengembalikan instance loader baru dengan
tipe yang diinginkan. Karena pengelola loader bisa mengelola beberapa loader
sekaligus, argumen ID akan mengidentifikasi loader yang akan dibuat instancenya.
Setelah dibuat, loader akan mulai memuat data, dan akan mengamati tanggal
perubahan Kita, serta memuat ulang jika diperlukan.
Untuk membuat CursorLoader, Kita memerlukan:
- uri—URI untuk materi yang diambil dari penyedia materi. URI
mengidentifikasi penyedia materi dan data yang akan diamati loader.
- projection — Daftar kolom yang akan dikembalikan. Meneruskan nol akan
mengembalikan semua kolom, jadi tidak efisien.
- selection — Filter yang mendeklarasikan baris yang akan dikembalikan,
diformat sebagai klausa WHERE dari SQL (tidak termasuk WHERE itu
sendiri). Meneruskan nol akan mengembalikan semua baris untuk URI yang
diberikan.
- selectionArgs — Kita dapat menyertakan ?s dalam selection, yang akan
digantikan dengan nilai dari selectionArgs, agar muncul dalam selection. Nilai-
nilai akan diikat sebagai String.
- sortOrder — Cara menyusun baris, diformat sebagai klausa ORDER BY dari
SQL (tidak termasuk ORDER BY itu sendiri). Meneruskan nol akan
menggunakan urutan sortir default, yang mungkin tidak berurutan.
43
onLoadFinished()
Menetapkan apa yang terjadi dengan data setelah loader mendapatkannya. Dalam
fungsi ini Kita harus:
- Merilis data lama.
- Menyimpan data baru dan, misalnya, menyediakannya untuk adapter Kita.
Loader kursor memantau data untuk Kita, jadi Kita tidak perlu, dan tidak
seharusnya dalam keadaan apa pun, melakukannya sendiri.
Loader juga membersihkannya sendiri setelah dirinya sendiri, jadi Kita tidak perlu
menutup kursor.
Jika Kita menggunakan RecyclerView untuk menampilkan data, yang perlu Kita
lakukan hanyalah meneruskan data ke adapter bila pemuatan atau pemuatan ulang
selesai.
onReset()
Dipanggil bila loader yang dibuat sebelumnya akan disetel ulang, sehingga datanya
tidak tersedia. Kita harus membersihkan semua referensi ke data di saat ini. Lagi,
jika Kita meneruskan data ke adapter untuk ditampilkan dalam RecyclerView,
adapter akan melakukan pekerjaan sebenarnya, Kita hanya perlu
menginstruksikannya.
44
4. Manfaat Kursor
Kita mungkin sudah mengetahui bahwa database menggunakan kursor, penyedia
materi menggunakan kursor, loader juga menggunakan kursor. Dengan menggunakan
tipe data yang sama di seluruh backend, dan hanya mengekstraknya dalam adapter,
tempat isi kursor dipersiapkan untuk ditampilkan, akan membuat backend seragam
dengan antarmuka yang bersih. Hal ini akan memudahkan penulisan kode,
memudahkan pengujian, dan memudahkan debug. Hal ini juga membuat kode lebih
sederhana dan lebih pendek.
5. Melengkapi Aplikasi Method
Diagram berikut menampilkan metode dan tipe data yang menghubungkan aneka
bagian aplikasi yang menggunakan:
Database SQLite untuk menyimpan data, dan subkelas SQLiteOpenHelper
untuk mengelola database.
Penyedia materi untuk menyediakan data ke aplikasi ini (dan aplikasi lainnya).
Loader untuk memuat data yang ditampilkan kepada pengguna.
RecyclerView.Adapter yang menampilkan dan memperbarui data yang
ditampilkan kepada pengguna di RecyclerView.
Kotak warna hijau menampilkan tumpukan panggilan dan perjalanan kursor
melalui beberapa layer aplikasi untuk query(). Perhatikan bagaimana penyisipan,
penghapusan, dan pembaruan tetap ditangani oleh resolver materi. Akan tetapi, loader
akan memberitahukan setiap perubahan yang buat oleh operasi penyisipan,
penghapusan, atau pembaruan, dan akan memuat ulang data bila diperlukan.
45
BAB III
PENUTUP
3.1 Kesimpulan
Android adalah OS open source yang dikembangkan oleh Google untuk dapat digunakan
oleh semua orang. Google juga memberikan kebebasan kepada para developer untuk membuat
dan mengembangkan software berbasis Android sesuai kebutuhkan mereka.
1. Penggunaan preferensi dan setting untuk mengatur penyimpanan data serta konfigurasi
layout.
2. Penggunaan SQLite untuk database yang membanu menyimpan data dan memproses
data.
3. Dengan content provider data dari aplikasi satu dapat kita hubungkan dengan data di
aplikasi lain, atau data aplikasi satu dapat diakses oleh aplikasi lain sesuai dengan hak
aksesnya.
4. Penggunaan Loader dan proses loading data baik besar maupun kecil.
3.2 Saran
Ada banyak sekali komponen-komponen dalam pengkodean dalam android yang dapat
anda terapkan saat membangun aplikasi. Oleh karena itu, carilah referensi lebih banyak dan
tetap konsisten.
46