Membuat Repository

Repository adalah sebuah class yang mengabstraksi akses ke sumber data.
Sebenarnya repository bukan merupakan Architecture Component, tetapi pendekatan
ini direkomendasikan untuk membagi kode. Sebuah class Repository menangani
operasi data untuk menyediakan API yang clean.

Langkah-langkah dalam membuat repository, dapat mengikuti langkah berikut:
- Buatlah package
repositoriesuntuk mengorganisasi classRepositoryyang dibutuhkan. Tambahkan class
UserRepositoryke dalam packagerepositories.public class UserRepository { }Tambahkan atribut dengan jenis
UserDao.private UserDao dao;Tambahkan constructor
UserRepositoryyang menerima argumenApplication.public UserRepository(Application application) { }Instansiasi atribut yang digunakan
UserRepository.AppDatabase db = AppDatabase.getInstance(application); dao = db.userDao();Tambahkan abstraksi operasi untuk mendapatkan user berdasarkan
username.public LiveData<User> getUserByUsername(String username) { return dao.getUserByUsername(username); }Tambahkan abstraksi operasi untuk insert user.
public void insert(User user) { ... }Untuk melakukan operasi yang berkaitan dengan database sebaiknya jangan dilakukan di main UI thread. Untuk menangani problem tersebut diperlukan
AsyncTask. Pada operasi mengambil data user, tidak diperlukanAsyncTaskkarena sudah ditangani olehLiveData.Buatlah inner class
InsertAsyncTaskdi dalam classUserRepository.private static class InsertAsyncTask extends AsyncTask<User, Void, Void> { ... }Pada baris class
InsertAsyncTasktekan shortcutAlt-Enter, pilih implement methods menu.Tambahkan atribut
asyncTaskDaodengan tipeUserdao.private UserDao asyncTaskDao;Tambahkan constructor
InsertAsyncTaskInsertAsyncTask(UserDao dao) { asyncTaskDao = dao; }Implementasi operasi yang dijalankan secara background
@Override protected Void doInBackground(User... users) { asyncTaskDao.insert(users); return null; }Jika
InsertAsyncTasktelah diimplementasikan, tambahkan operasi insert yang nanti dijalankan secara background.public void insert(User user) { new InsertAsyncTask(dao).execute(user); }Implementasi
UserRepositorytelah selesai, lanjutkan untuk membuat repository terkait denganNote, dan beri namaNoteRepository.public class NoteRepository { ... }Tambahkan atribut untuk mengakses terkait data
Notemelalui DAO.private NoteDao noteDao;Tambahkan atribut untuk menampung data kumpulan
Notedengan jenisLiveData.private LiveData<List<Note>> notes;Sisipkan constructor
NoteRepositoryyang menerima argumenApplicationpublic NoteRepository(Application application) { ... }Instansiasi atribut-atribut yang telah didefinisikan, serta fetch semua data
Noteyang tersimpan.... AppDatabase db = AppDatabase.getInstance(application); noteDao = db.noteDao(); notes = noteDao.getAll(); ...Tambahkan operasi pengambilan data catatan yang telah tersimpan dalam atribut
notes.public LiveData<List<Note>> getNotes() { return notes; }Pada data
Notedibutuhkan operasi insert serta update, dikarenakan operasi tersebut tidak disarankan dijalankan di main UI thread maka dibutuhkan inner class AsyncTask. Buatlah inner classInsertAsyncTaskyang digunakan untuk operasi insert danUpdateAsyncTaskuntuk operasi update. Isi implementasi dalam AsyncTask dapat mengadaptasi dariInsertAsyncTaskdalamUserRepository.Implementasikan operasi insert serta update
public void insert(Note note) { new InsertAsyncTask(noteDao) .execute(note); }public void update(Note note) { new UpdateAsyncTask(noteDao) .execute(note); }