Android fundamentals 10.1 Part A: Room, LiveData, and ViewModel

Widya Ayu Agustania
11 min readApr 25, 2019

3. Task 1: Create the RoomWordsSample app

  1. Create an app with one Activity

Buka Android Studio dan buat aplikasi. Pada layar pengaturan, lakukan hal berikut:
Beri nama aplikasi RoomWordsSample.
Jika Anda melihat kotak centang untuk Sertakan dukungan Kotlin dan Sertakan dukungan C ++, hapus centang pada kedua kotak.
Pilih hanya faktor bentuk Ponsel & Tablet, dan atur SDK minimum ke API 14 atau lebih tinggi.
Pilih Aktivitas Dasar.

  1. 2 Update Gradle files

Tambahkan kode berikut ke file build.gradle (Module: app) Anda, ke bagian bawah blok dependensi (tetapi masih di dalamnya).

2. Di file build.gradle (Project: RoomWordsSample) Anda, tambahkan nomor versi di akhir file.

4. Task 2: Create the Word entity

Diagram di bawah ini adalah diagram arsitektur lengkap dengan komponen yang akan Anda implementasikan dalam tugas ini yang disorot. Setiap tugas akan memiliki diagram seperti itu untuk membantu Anda memahami di mana komponen saat ini cocok dengan struktur keseluruhan aplikasi, dan untuk melihat bagaimana komponen-komponen tersebut terhubung.

Data untuk aplikasi ini adalah kata-kata, dan setiap kata diwakili oleh entitas dalam database. Dalam tugas ini Anda membuat kelas Word dan membubuhi keterangan sehingga Room dapat membuat tabel database darinya. Diagram di bawah ini menunjukkan tabel database word_table. Tabel ini memiliki satu kolom kata, yang juga bertindak sebagai kunci utama, dan dua baris, masing-masing untuk “Hello” dan “World.”

2.1 Create the Word class

  1. Buat kelas yang disebut Word.
  2. Tambahkan konstruktor yang menggunakan string kata sebagai argumen. Tambahkan anotasi @NonNull sehingga parameter tidak akan pernah menjadi nol.
  3. Tambahkan metode “getter” yang disebut getWord () yang mengembalikan kata. Kamar membutuhkan metode “pengambil” pada kelas entitas sehingga dapat membuat instance objek Anda.

2.2 Annotate the Word class

  1. Buat kelas yang disebut Word.
  2. Tambahkan konstruktor yang menggunakan string kata sebagai argumen.
  3. Tambahkan anotasi @NonNull sehingga parameter tidak akan pernah menjadi nol.
  4. Tambahkan metode “getter” yang disebut getWord () yang mengembalikan kata. Kamar membutuhkan metode “pengambil” pada kelas entitas sehingga dapat membuat instance objek Anda.
  5. Masukan code berikut

@Entity(tableName = “word_table”) public class Word { @PrimaryKey @NonNull @ColumnInfo(name = “word”) private String mWord; public Word(@NonNull String word) {this.mWord = word;} public String getWord(){return this.mWord;} }

5. Task 3: Create the DAO

3.1 Implement the DAO class

  1. Buat interface baru dan sebut saja WordDao.
  2. Buat anotasi deklarasi kelas dengan @Dao untuk mengidentifikasi kelas sebagai kelas DAO untuk Kamar.
  3. Deklarasikan metode untuk memasukkan satu kata:

4. Beri anotasi metode insert () dengan @Insert. Anda tidak harus menyediakan SQL apa pun! (Ada juga penjelasan @Delete dan @Update untuk menghapus dan memperbarui satu baris, tetapi Anda tidak menggunakan operasi ini di versi awal aplikasi ini.)
5. Nyatakan metode untuk menghapus semua kata:

6. Tidak ada penjelasan kenyamanan untuk menghapus banyak entitas, jadi beri catatan metode deleteAll () dengan @Query umum. Berikan query SQL sebagai parameter string ke @Query. Beri anotasi metode deleteAll () sebagai berikut:

7. Buat metode yang disebut getAllWords () yang mengembalikan Daftar Kata

8. Beri anotasi metode getAllWords () dengan kueri SQL yang mendapatkan semua kata dari word_table, disortir berdasarkan abjad untuk kenyamanan

6. Task 4: Use LiveData

4.1 Return LiveData in WordDao

Di antarmuka WordDao, ubah tanda tangan metode getAllWords () sehingga Daftar <Word> yang dikembalikan dibungkus dengan LiveData <>.

7. Task 5: Add a Room database

5.1 Implement a Room database

  1. Buat kelas abstrak publik yang memperluas RoomDatabase dan menyebutnya WordRoomDatabase.

2. Beri catatan pada kelas untuk menjadi basis data Kamar. Deklarasikan entitas yang termasuk dalam database — dalam hal ini hanya ada satu entitas, Word. (Mendaftarkan kelas entitas atau kelas membuat tabel yang sesuai di database.) Tetapkan nomor versi. Juga atur skema ekspor ke false, exportSchema menyimpan riwayat versi skema. Untuk praktis ini, Anda dapat menonaktifkannya, karena Anda tidak memigrasi basis data.

3. Tentukan DAO yang bekerja dengan database. Berikan metode “pengambil” abstrak untuk setiap @POR.

4. Buat WordRoomDatabase sebagai singleton untuk mencegah beberapa instance database dibuka secara bersamaan, yang akan menjadi hal yang buruk. Berikut adalah kode untuk membuat singleton:

5. Tambahkan kode untuk membuat database di mana ditunjukkan oleh komentar Buat database di sini dalam kode di atas.

6. Tambahkan strategi migrasi untuk database.

8. Task 6: Create the Repository

6.1 Implement the Repository

  1. Buat kelas publik yang disebut WordRepository.
  2. Tambahkan variabel anggota untuk DAO dan daftar kata-kata.

3. Tambahkan konstruktor yang menangani database dan menginisialisasi variabel anggota.

4. Tambahkan metode pembungkus yang disebut getAllWords () yang mengembalikan kata-kata yang di-cache sebagai LiveData. Kamar mengeksekusi semua pertanyaan pada utas terpisah. LiveData yang Teramati memberi tahu pengamat ketika data berubah.

5. Tambahkan pembungkus untuk metode insert (). Gunakan AsyncTask untuk memanggil insert () pada utas non-UI, atau aplikasi Anda akan macet. Room memastikan bahwa Anda tidak melakukan operasi jangka panjang pada utas utama, yang akan memblokir UI.

6. Buat insertAsyncTask sebagai kelas dalam. Anda harus terbiasa dengan AsyncTask, jadi di sini adalah kode insertAsyncTask untuk Anda salin:

9. Task 7: Create the ViewModel

7.1 Implement the WordViewModel

  1. Buat sebuah kelas bernama WordViewModel extends dari AndroidViewModel.

2. Tambahkan variabel anggota pribadi untuk menyimpan referensi ke Repositori.

3. Tambahkan variabel anggota LiveData pribadi ke cache daftar kata.

4. Tambahkan konstruktor yang mendapatkan referensi ke WordRepository dan dapatkan daftar semua kata dari WordRepository.

5. Tambahkan metode “pengambil” yang mendapatkan semua kata. Ini sepenuhnya menyembunyikan implementasi dari UI.

6. Buat metode sisipan wrapper () yang memanggil metode insert () repositori. Dengan cara ini, implementasi insert () sepenuhnya tersembunyi dari UI.

10. Task 8: Add XML layouts for the UI

8.1 Add styles

  1. Ubah warna dalam colors.xml ke yang berikut: (untuk menggunakan warna Desain Material):

2. Tambahkan styleuntuk tampilan teks dalam file value/ styles.xml:

8.2 Add item layout

  • Tambahkan sebuah layout/recyclerview_item.xml layout:

8.3 Add the RecyclerView

  1. Pada layout/content_main.xml file, Tambahkan sebuah background color untuk ConstraintLayout:

2. Pada content_main.xml file, replace TextView element dengan sebuah RecyclerView element:

8.4 Fix the icon in the FAB

Ikon di tombol tindakan mengambang Anda (FAB) harus sesuai dengan tindakan yang tersedia. Dalam file layout / activity_main.xml, beri ikon simbol + FloatingActionButton:

  1. Pilih File > New > Vector Asset.
  2. Pilih Material Icon.
  3. Click Android robot icon in di Icon: field, kemudian pilih + ("add") asset.
  4. Pada layout/activity_main.xml file, di FloatingActionButton, Ubah srcCompat attribute
android:src="@drawable/ic_add_black_24dp"

11. Task 9: Create an Adapter and adding the RecyclerView

9.1 Create the WordListAdapter class

Tambahkan kelas WordListAdapter yang memperluas RecyclerView.Adapter. Adaptor menyimpan data cache dan mengisi RecyclerView dengannya. WordViewHolder kelas dalam memegang dan mengelola tampilan untuk satu item daftar.

public class WordListAdapter extends RecyclerView.Adapter<WordListAdapter.WordViewHolder> { private final LayoutInflater mInflater; private List<Word> mWords; // Cached copy of words WordListAdapter(Context context) { mInflater = LayoutInflater.from(context); } @Override public WordViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = mInflater.inflate(R.layout.recyclerview_item, parent, false); return new WordViewHolder(itemView); } @Override public void onBindViewHolder(WordViewHolder holder, int position) { if (mWords != null) { Word current = mWords.get(position); holder.wordItemView.setText(current.getWord()); } else { // Covers the case of data not being ready yet. holder.wordItemView.setText(“No Word”); } }

void setWords(List<Word> words){ mWords = words; notifyDataSetChanged(); } // getItemCount() is called many times, and when it is first called, // mWords has not been updated (means initially, it’s null, and we can’t return null). @Override public int getItemCount() { if (mWords != null) return mWords.size(); else return 0; } class WordViewHolder extends RecyclerView.ViewHolder { private final TextView wordItemView; private WordViewHolder(View itemView) { super(itemView); wordItemView = itemView.findViewById(R.id.textView); } } }

9.2 Add RecyclerView to MainActivity

  1. Tambahkan RecyclerView pada onCreate() methoddari MainActivity:
RecyclerView recyclerView = findViewById(R.id.recyclerview);
final WordListAdapter adapter = new WordListAdapter(this);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

12. Task 10: Populate the database

10.1 Create the callback for populating the database

  1. Tambahkan panggilan balik onOpen () di kelas WordRoomDatabase:

2. Buat kelas dalam PopulateDbAsync yang memperluas AsycTask. Terapkan metode doInBackground () untuk menghapus semua kata, lalu buat yang baru. Berikut adalah kode untuk AsyncTask yang menghapus isi dari basis data, lalu mengisinya dengan daftar kata-kata awal.

private static class PopulateDbAsync extends AsyncTask<Void, Void, Void> { private final WordDao mDao; String[] words = {“dolphin”, “crocodile”, “cobra”}; PopulateDbAsync(WordRoomDatabase db) { mDao = db.wordDao(); } @Override protected Void doInBackground(final Void… params) { // Start the app with a clean database every time. // Not needed if you only populate the database // when it is first created mDao.deleteAll(); for (int i = 0; i <= words.length — 1; i++) { Word word = new Word(words[i]); mDao.insert(word); } return null; } }

3. Tambahkan panggilan balik ke urutan pembuatan basis data di WordRoomDatabase, tepat sebelum Anda memanggil .build ():

13. Task 11: Connect the UI with the data

11.1 Display the words

14. Task 12: Create an Activity for adding words

12.1 Create the NewWordActivity

Tambahkan string resources pada values/strings.xml file:

Tambahkan sebuah style untuk buttons pada value/styles.xml

Update activity_new_word.xml file pada layout folder:

HASIL RUNNING APLIKASI

Android fundamentals 10.1 Part B: Deleting data from a Room database

3. Task 1: Initialize data only if the database is empty

  1. 1 Add a method to the DAO to get a single word

Di interface WordDao, tambahkan metode untuk mendapatkan word:

  1. 2 Update the initialization method to check whether data exists

PopulateDBAsync adalah kelas dalam di WordRoomDatbase. Di PopulateDBAsync, perbarui metode doInBackground () untuk memeriksa apakah database memiliki kata sebelum menginisialisasi data:

4. Task 2: Delete all words

2.1 Add deleteAll() to the WordDao interface and annotate it

Di WordDao, periksa bahwa metode deleteAll () didefinisikan dan dijelaskan dengan SQL yang berjalan ketika metode dijalankan:

2.2 Add deleteAll() to the WordRepository class

Di WordRepository, tentukan deleteAllWordsAsyncTask sebagai kelas dalam. Terapkan doInBackground () untuk menghapus semua kata dengan memanggil deleteAll () di DAO:

Di kelas WordRepository, tambahkan metode deleteAll () untuk memanggil AsyncTask yang Anda tetapkan.

public void deleteAll()  {
new deleteAllWordsAsyncTask(mWordDao).execute();
}

2.3 Add deleteAll() to the WordViewModel class

Pada WordViewModel class, tambahkan deleteAll() method:

5. Task 3: Add an Options menu item to delete all data

3.1 Add the Clear all data menu option

Di menu_main.xml, ubah judul opsi menu dan id, sebagai berikut:

<item android:id=”@+id/clear_data” android:orderInCategory=”100" android:title=”@string/clear_all_data” app:showAsAction=”never” />

Di MainActivity, terapkan metode onOptionsItemSelected () untuk memanggil metode deleteAll () pada objek WordViewModel.

6. Task 4: Delete a single word

4.1 Add deleteWord() to the DAO and annotate it

Di WordDao, tambahkan metode deleteWord ():

4.2 Add deleteWord() to the WordRepository class

Di WordRepository, tentukan AsyncTask lain yang disebut deleteWordAsyncTask sebagai kelas dalam. Terapkan doInBackground () untuk menghapus kata dengan memanggil deleteWord () di DAO:

Di WordRepository, tambahkan metode deleteWord () untuk memanggil AsyncTask yang Anda tentukan.

4.3 Add deleteWord() to the WordViewModel class

Di WordViewModel, tambahkan metode deleteWord ():

7. Task 5: Enable users to swipe words away

5.1 Enable the adapter to detect the swiped word

Di WordListAdapter, tambahkan metode untuk mendapatkan kata pada posisi yang diberikan

Di MainActivity, di onCreate (), buat ItemTouchHelper. Pasang ItemTouchHelper ke RecyclerView.

HASIL RUN APLIKASI

--

--