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
repositories
untuk mengorganisasi classRepository
yang dibutuhkan. Tambahkan class
UserRepository
ke dalam packagerepositories
.public class UserRepository { }
Tambahkan atribut dengan jenis
UserDao
.private UserDao dao;
Tambahkan constructor
UserRepository
yang 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 diperlukanAsyncTask
karena sudah ditangani olehLiveData
.Buatlah inner class
InsertAsyncTask
di dalam classUserRepository
.private static class InsertAsyncTask extends AsyncTask<User, Void, Void> { ... }
Pada baris class
InsertAsyncTask
tekan shortcutAlt-Enter
, pilih implement methods menu.Tambahkan atribut
asyncTaskDao
dengan tipeUserdao
.private UserDao asyncTaskDao;
Tambahkan constructor
InsertAsyncTask
InsertAsyncTask(UserDao dao) { asyncTaskDao = dao; }
Implementasi operasi yang dijalankan secara background
@Override protected Void doInBackground(User... users) { asyncTaskDao.insert(users); return null; }
Jika
InsertAsyncTask
telah diimplementasikan, tambahkan operasi insert yang nanti dijalankan secara background.public void insert(User user) { new InsertAsyncTask(dao).execute(user); }
Implementasi
UserRepository
telah selesai, lanjutkan untuk membuat repository terkait denganNote
, dan beri namaNoteRepository
.public class NoteRepository { ... }
Tambahkan atribut untuk mengakses terkait data
Note
melalui DAO.private NoteDao noteDao;
Tambahkan atribut untuk menampung data kumpulan
Note
dengan jenisLiveData
.private LiveData<List<Note>> notes;
Sisipkan constructor
NoteRepository
yang menerima argumenApplication
public NoteRepository(Application application) { ... }
Instansiasi atribut-atribut yang telah didefinisikan, serta fetch semua data
Note
yang 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
Note
dibutuhkan operasi insert serta update, dikarenakan operasi tersebut tidak disarankan dijalankan di main UI thread maka dibutuhkan inner class AsyncTask. Buatlah inner classInsertAsyncTask
yang digunakan untuk operasi insert danUpdateAsyncTask
untuk operasi update. Isi implementasi dalam AsyncTask dapat mengadaptasi dariInsertAsyncTask
dalamUserRepository
.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); }