1. Sebelum memulai
Codelab ini memperkenalkan aplikasi baru bernama Forage yang akan Anda bangun sendiri. Codelab ini memandu Anda melakukan langkah-langkah untuk menyelesaikan project aplikasi Forage, seperti penyiapan dan pengujian project dalam Android Studio.
Prasyarat
- Project ini ditujukan bagi siswa yang telah menyelesaikan Unit 5 kursus Dasar-Dasar Android di Kotlin.
Yang akan Anda bangun
- Menambahkan persistensi dengan Room ke aplikasi yang ada dengan mengimplementasikan entity, DAO, ViewModel, dan class database.
Yang akan Anda butuhkan
- Komputer yang dilengkapi Android Studio.
2. Ringkasan aplikasi yang sudah selesai
Aplikasi Forage yang telah selesai memungkinkan pengguna melacak berbagai item, misalnya makanan, yang telah mereka telusuri. Data ini disimpan di antara sesi yang menggunakan Room. Anda akan menggunakan pengetahuan Room dan melakukan operasi baca, tulis, update, dan hapus di database untuk mengimplementasikan persistensi di aplikasi Forage. Aplikasi yang sudah selesai dan fungsinya dijelaskan di bawah ini.
Saat aplikasi pertama kali diluncurkan, pengguna akan melihat layar kosong yang berisi tampilan recycler yang akan menampilkan item yang telah ditelusuri, serta tombol mengambang di pojok kanan bawah untuk menambahkan item baru.
Saat menambahkan item baru, pengguna dapat menentukan nama, lokasi tempat item tersebut ditemukan, serta beberapa catatan tambahan. Terdapat juga kotak centang untuk melihat apakah item makanan sedang musim atau tidak.
Setelah ditambahkan, item akan muncul dalam tampilan recycler di layar pertama.
Dengan mengetuk item, Anda akan beralih ke layar detail yang menampilkan nama, lokasi, dan catatan.
Tombol mengambang juga akan berubah dari simbol plus menjadi ikon edit. Dengan mengetuk tombol ini, Anda akan beralih ke layar yang memungkinkan Anda mengedit nama, lokasi, catatan, dan kotak centang "in season". Mengetuk tombol delete akan menghapus item dari database.
Meskipun bagian UI aplikasi ini telah diimplementasikan, tugas Anda adalah mengimplementasikan persistensi menggunakan pengetahuan Anda tentang Room sehingga aplikasi akan membaca, menulis, memperbarui, dan menghapus item dari database.
3. Memulai
Mendownload kode project
Perhatikan bahwa nama folder adalah android-basics-kotlin-forage-app
. Pilih folder ini saat Anda membuka project di Android Studio.
Untuk mendapatkan kode codelab ini dan membukanya di Android Studio, lakukan hal berikut.
Mendapatkan kode
- Klik URL yang diberikan. Tindakan ini akan membuka halaman GitHub project di browser.
- Di halaman GitHub project, klik tombol Code yang akan menampilkan dialog.
- Di dialog, klik tombol Download ZIP untuk menyimpan project di komputer. Tunggu download selesai.
- Temukan file di komputer Anda (mungkin di folder Downloads).
- Klik dua kali pada file ZIP untuk mengekstraknya. Tindakan ini akan membuat folder baru yang berisi file project.
Membuka project di Android Studio
- Mulai Android Studio.
- Di jendela Welcome to Android Studio, klik Open an existing Android Studio project.
Catatan: Jika Android Studio sudah terbuka, pilih opsi menu File > New > Import Project.
- Di dialog Import Project, buka lokasi folder project yang telah diekstrak (kemungkinan ada di folder Downloads).
- Klik dua kali pada folder project tersebut.
- Tunggu Android Studio membuka project.
- Klik tombol Run untuk membangun dan menjalankan aplikasi. Pastikan aplikasi dibangun seperti yang diharapkan.
- Cari file project di jendela alat Project untuk melihat cara aplikasi disiapkan.
4. Menyiapkan project untuk menggunakan Room
Menentukan entity Forageable
Project ini sudah memiliki class Forageable
yang menentukan data aplikasi (model.Forageable.kt). Class ini memiliki beberapa properti: id
, name
, address
, inSeason
, dan notes
.
data class Forageable(
val id: Long = 0,
val name: String,
val address: String,
val inSeason: Boolean,
val notes: String?
)
Namun, agar dapat menggunakan class ini untuk menyimpan data persisten, Anda harus mengonversinya menjadi entity Room.
- Anotasikan class menggunakan
@Entity
dengan nama tabel"forageable_database"
. - Jadikan properti
id
sebagai kunci utama. Kunci utama harus dibuat secara otomatis. - Tetapkan nama kolom untuk properti
inSeason
menjadi"in_season"
.
Mengimplementasikan DAO
ForageableDao
(data.ForageableDao.kt), seperti yang mungkin Anda duga, adalah tempat untuk menentukan metode membaca dan menulis dari database yang akan diakses dari model tampilan. DAO hanyalah antarmuka yang Anda tentukan. Oleh karena itu, Anda tidak perlu menulis kode untuk mengimplementasikan metode ini. Sebagai gantinya, Anda harus menggunakan anotasi Room dengan menentukan kueri SQL jika diperlukan.
Dalam antarmuka ForageableDao
, Anda harus menambahkan lima metode.
- Metode
getForageables()
yang menampilkanFlow<List<Forageable>>
untuk semua baris dalam database. - Metode
getForageable(id: Long)
yang menampilkanFlow<Forageable>
yang cocok denganid
yang telah ditentukan. - Metode
insert(forageable: Forageable)
yang menyisipkanForageable
baru ke dalam database. - Metode
update(forageable: Forageable)
yang menggunakanForageable
yang ada sebagai parameter dan memperbarui baris sesuai dengan metode tersebut. - Metode
delete(forageable: Forageable)
yang menggunakanForageable
sebagai parameter dan menghapusnya dari database.
Mengimplementasikan model tampilan
ForageableViewModel
(ui.viewmodel.ForageableViewModel.kt) diterapkan sebagian, tetapi Anda harus menambahkan fungsionalitas yang mengakses metode DAO agar dapat membaca dan menulis data. Lakukan langkah-langkah berikut untuk menerapkan ForageableViewModel
.
- Instance
ForageableDao
harus diteruskan sebagai parameter di konstruktor class. - Buat variabel jenis
LiveData<List<Forageable>>
yang mendapatkan seluruh daftar entityForageable
menggunakan DAO, dan konversikan hasilnya menjadiLiveData
. - Buat metode yang menggunakan id (dengan jenis
Long
) sebagai parameter dan menampilkanLiveData<Forageable>
dari pemanggilan metodegetForageable()
pada DAO, lalu mengonversi hasilnya menjadiLiveData
. - Di metode
addForageable()
, luncurkan coroutine menggunakanviewModelScope
dan gunakan DAO untuk menyisipkan instanceForageable
ke dalam database. - Dalam metode
updateForageable()
, gunakan DAO untuk memperbarui entityForageable
. - Dalam metode
deleteForageable()
, gunakan DAO untuk memperbarui entityForageable
. - Buat
ViewModelFactory
yang dapat membuat instanceForageableViewModel
dengan parameter konstruktorForageableDao
.
Mengimplementasikan class Database
Class ForageDatabase
(data.ForageDatabase.kt
) adalah elemen yang sebenarnya mengekspos entity dan DAO ke Room. Terapkan class ForageDatabase
seperti yang telah dijelaskan.
- Entity:
Forageable
- Versi:
1
- exportSchema:
false
- Di dalam class
ForageDatabase
, sertakan fungsi abstrak untuk menampilkanForageableDao
- Di dalam class
ForageDatabase
, tentukan objek pendamping dengan variabel pribadi yang disebutINSTANCE
dan fungsigetDatabase()
yang menampilkan singletonForageDatabase
.
- Di class
BaseApplication
, buat propertidatabase
yang menampilkan instanceForageDatabase
menggunakan inisialisasi lambat.
5. Mempertahankan dan membaca data dari fragmen
Setelah menyiapkan entity, DAO, model tampilan, dan menentukan class database untuk mengeksposnya ke Room, Anda hanya perlu mengubah Fragment agar dapat mengakses model tampilan. Anda harus membuat perubahan dalam tiga file, satu file untuk setiap layar di aplikasi.
Daftar Forageable
Layar daftar forageable hanya memerlukan dua hal: referensi ke model tampilan, dan akses ke daftar lengkap forageable. Lakukan tugas berikut di ui.ForageableListFragment.kt.
- Class ini sudah memiliki properti
viewModel
. Namun, langkah ini tidak menggunakan factory yang sudah Anda tentukan di langkah sebelumnya. Anda harus memfaktorkan ulang deklarasi ini terlebih dahulu untuk menggunakanForageableViewModelFactory
.
private val viewModel: ForageableViewModel by activityViewModels {
ForageableViewModelFactory(
(activity?.application as BaseApplication).database.foragableDao()
)
}
- Kemudian di
onViewCreated()
, amati propertiallForageables
dariviewModel
dan panggilsubmitList()
di adaptor jika sesuai untuk mengisi daftar.
Layar detail Forageable
Anda akan melakukan hal yang hampir sama untuk daftar detail di ui/ForageableDetailFragment.kt.
- Konversikan properti
viewModel
untuk menginisialisasiForageableViewModelFactory
dengan benar. - Di
onViewCreated()
, panggilgetForageable()
pada model tampilan dengan meneruskanid
, untuk mendapatkan entityForageable
. Amati livedata dan setel hasilnya ke propertiforageable
, lalu panggilbindForageable()
untuk mengupdate UI.
Menambahkan dan mengedit layar forageable
Terakhir, Anda harus melakukan hal yang sama di ui.AddForageableFragment.kt. Perhatikan bahwa layar ini juga bertanggung jawab untuk memperbarui dan menghapus entity. Namun, metode dari model tampilan ini sudah dipanggil di tempat yang benar. Anda hanya perlu membuat dua perubahan pada file ini.
- Sekali lagi, faktorkan ulang properti
viewModel
untuk menggunakanForageableViewModelFactory
. - Di
onViewCreated()
, di blok pernyataan if sebelum menetapkan visibilitas tombol hapus, panggilgetForageable()
di model tampilan, teruskanid
, dan setel hasilnya ke propertiforageable
.
Hanya ini yang perlu Anda lakukan di fragmen. Anda kini dapat menjalankan aplikasi dan melihat cara kerja semua fungsi persistensi.
6. Petunjuk pengujian
Menjalankan pengujian
Untuk menjalankan pengujian, Anda dapat melakukan salah satu dari hal berikut.
Untuk satu kasus pengujian, buka class kasus pengujian, PersistenceInstrumentationTests.kt
, dan klik panah hijau di sebelah kiri deklarasi class. Kemudian Anda dapat memilih opsi Run dari menu. Tindakan ini akan menjalankan semua pengujian dalam kasus pengujian.
Sering kali Anda hanya ingin menjalankan satu pengujian, misalnya, jika hanya ada satu pengujian yang gagal dan yang lainnya lulus pengujian. Anda dapat menjalankan satu pengujian seperti halnya seluruh kasus pengujian. Gunakan panah hijau dan pilih opsi Run.
Jika memiliki beberapa kasus pengujian, Anda juga dapat menjalankan seluruh rangkaian pengujian. Sama seperti menjalankan aplikasi, Anda dapat menemukan opsi ini pada menu Run.
Perhatikan bahwa Android Studio akan menetapkan secara default ke target terakhir yang Anda jalankan (aplikasi, target pengujian, dll.), jadi jika menu masih menampilkan Run > Run ‘app', Anda dapat menjalankan target pengujian, dengan memilih Run > Run.
Kemudian, pilih target pengujian dari menu pop-up.