Project: Aplikasi Forage

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.

3edd87e63c387d88.png

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.

6c0c739569bb3b4f.png

Setelah ditambahkan, item akan muncul dalam tampilan recycler di layar pertama.

bcc75e60b70320e8.png

Dengan mengetuk item, Anda akan beralih ke layar detail yang menampilkan nama, lokasi, dan catatan.

5096995a4921dcac.png

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.

f8c708fed3dede1a.png

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

  1. Klik URL yang diberikan. Tindakan ini akan membuka halaman GitHub project di browser.
  2. Di halaman GitHub project, klik tombol Code yang akan menampilkan dialog.

5b0a76c50478a73f.png

  1. Di dialog, klik tombol Download ZIP untuk menyimpan project di komputer. Tunggu download selesai.
  2. Temukan file di komputer Anda (mungkin di folder Downloads).
  3. Klik dua kali pada file ZIP untuk mengekstraknya. Tindakan ini akan membuat folder baru yang berisi file project.

Membuka project di Android Studio

  1. Mulai Android Studio.
  2. Di jendela Welcome to Android Studio, klik Open an existing Android Studio project.

36cc44fcf0f89a1d.png

Catatan: Jika Android Studio sudah terbuka, pilih opsi menu File > New > Import Project.

21f3eec988dcfbe9.png

  1. Di dialog Import Project, buka lokasi folder project yang telah diekstrak (kemungkinan ada di folder Downloads).
  2. Klik dua kali pada folder project tersebut.
  3. Tunggu Android Studio membuka project.
  4. Klik tombol Run 11c34fc5e516fb1c.png untuk membangun dan menjalankan aplikasi. Pastikan aplikasi dibangun seperti yang diharapkan.
  5. 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.

  1. Anotasikan class menggunakan @Entity dengan nama tabel "forageable_database".
  2. Jadikan properti id sebagai kunci utama. Kunci utama harus dibuat secara otomatis.
  3. 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.

  1. Metode getForageables() yang menampilkan Flow<List<Forageable>> untuk semua baris dalam database.
  2. Metode getForageable(id: Long) yang menampilkan Flow<Forageable> yang cocok dengan id yang telah ditentukan.
  3. Metode insert(forageable: Forageable) yang menyisipkan Forageable baru ke dalam database.
  4. Metode update(forageable: Forageable) yang menggunakan Forageable yang ada sebagai parameter dan memperbarui baris sesuai dengan metode tersebut.
  5. Metode delete(forageable: Forageable) yang menggunakan Forageable 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.

  1. Instance ForageableDao harus diteruskan sebagai parameter di konstruktor class.
  2. Buat variabel jenis LiveData<List<Forageable>> yang mendapatkan seluruh daftar entity Forageable menggunakan DAO, dan konversikan hasilnya menjadi LiveData.
  3. Buat metode yang menggunakan id (dengan jenis Long) sebagai parameter dan menampilkan LiveData<Forageable> dari pemanggilan metode getForageable() pada DAO, lalu mengonversi hasilnya menjadi LiveData.
  4. Di metode addForageable(), luncurkan coroutine menggunakan viewModelScope dan gunakan DAO untuk menyisipkan instance Forageable ke dalam database.
  5. Dalam metode updateForageable(), gunakan DAO untuk memperbarui entity Forageable.
  6. Dalam metode deleteForageable(), gunakan DAO untuk memperbarui entity Forageable.
  7. Buat ViewModelFactory yang dapat membuat instance ForageableViewModel dengan parameter konstruktor ForageableDao.

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.

  1. Entity: Forageable
  2. Versi: 1
  3. exportSchema: false
  4. Di dalam class ForageDatabase, sertakan fungsi abstrak untuk menampilkan ForageableDao
  5. Di dalam class ForageDatabase, tentukan objek pendamping dengan variabel pribadi yang disebut INSTANCE dan fungsi getDatabase() yang menampilkan singleton ForageDatabase.
  1. Di class BaseApplication, buat properti database yang menampilkan instance ForageDatabase 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.

  1. 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 menggunakan ForageableViewModelFactory.
private val viewModel: ForageableViewModel by activityViewModels {
   ForageableViewModelFactory(
       (activity?.application as BaseApplication).database.foragableDao()
   )
}
  1. Kemudian di onViewCreated(), amati properti allForageables dari viewModel dan panggil submitList() di adaptor jika sesuai untuk mengisi daftar.

Layar detail Forageable

Anda akan melakukan hal yang hampir sama untuk daftar detail di ui/ForageableDetailFragment.kt.

  1. Konversikan properti viewModel untuk menginisialisasi ForageableViewModelFactory dengan benar.
  2. Di onViewCreated(), panggil getForageable() pada model tampilan dengan meneruskan id, untuk mendapatkan entity Forageable. Amati livedata dan setel hasilnya ke properti forageable, lalu panggil bindForageable() 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.

  1. Sekali lagi, faktorkan ulang properti viewModel untuk menggunakan ForageableViewModelFactory.
  2. Di onViewCreated(), di blok pernyataan if sebelum menetapkan visibilitas tombol hapus, panggil getForageable() di model tampilan, teruskan id, dan setel hasilnya ke properti forageable.

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.

3e640ec727599a6d.png

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.

8647a76419540499.png

Jika memiliki beberapa kasus pengujian, Anda juga dapat menjalankan seluruh rangkaian pengujian. Sama seperti menjalankan aplikasi, Anda dapat menemukan opsi ini pada menu Run.

7a925c5e196725bb.png

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.

90d3ec5ca5928b2a.png

Kemudian, pilih target pengujian dari menu pop-up.

3b1a7d82a55b5f13.png