Android Architecture Components — Room & Live Data

Room adalah library yang dikembangkan oleh google untuk memudahkan access SQLite (Database) yang digunakan untuk applikasi android. Room merupakan bagian dari salah satu android achitecture component yang belakangan ini sering diterapkan untuk pengembangan aplikasi android.

Ada 3 komponen utama yang dimiliki oleh Room :

  1. Database — Berisi inisiasi nama database yang dipake dan akses koneksi ke database
  2. Entity — Class representasi dari table database yang digunakan
  3. DAO (Database Acess Object) — Merupakan method atau task yang digunakan terhadap data (Mekanisme CRUD)

Bagaimanakah menggunkan room.

  1. Update gradle dependency, dependency room berada dalam maven repository terbaru milik google jadi harus ditambahkan berikut
allprojects {
repositories {
google()
jcenter()
}
}

2. Tambahkan room ke dalam build.gradle

compile 'android.arch.persistence.room:runtime:1.0.0'

3. Buat class Entity untuk mapping data ke tablenya, contoh sebagai berikut

@Entity
public class Members {

@PrimaryKey(autoGenerate = true)
private int id;
private String name;
private String address;
private String position;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

public String getPosition() {
return position;
}

public void setPosition(String position) {
this.position = position;
}
}

4. Buat DAO (Data Access Object)

@Dao
public interface DaoMember {

@Insert
void insertMultipleMember(Members... members);

@Insert
void insertMembers(Members members);

@Query("SELECT * FROM Members")
List<Members> getAllMembers();


@Query("SELECT * FROM Members WHERE id =:id_member")
Members getMemberById(int id_member);

@Update
void updateRecord(Members members);

@Delete
void deleteRecord(Members members);
}

5. Buat class database untuk melakukan conection dan mapping entity data serta implemen DAOnya

@Database(entities = {Members.class}, version = 1)
public abstract class SampleDatabase extends RoomDatabase{
public abstract DaoMember daoMember();
}

6. Implement di Activitynya

SampleDatabase sampleDatabase = Room.databaseBuilder(this, SampleDatabase.class, "sample-db").build();

Setelah deklarasi baru DAOnya bisa diakses, Room hanya bisa berjalan di background Thread. dilarang mengunakan room di Main Thread karena akan terjadi force close. Salah satu solusinya dengan menggunakan Async Task.

java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

Berikut adalah contoh menggunakan async task

new AsyncTask<Void, Void, Integer>(){

@Override
protected Integer doInBackground(Void... voids) {

Members members = new Members();
//members.setId(1);
members.setName("Jhony Deep");
members.setAddress("Sleman");
members.setPosition("Android dev");


daoMember.insertMembers(members);

List<Members> dataMembers = daoMember.getAllMembers();

for(Member members1: dataMembers){
Log.d("AF", "Name "+members1.getName())
        }

return 1;
}
}.execute();

Live Data adalah observable class holder yang akan memberikan notif jika terjadi perubahan data. Keuntungan menggunakan Live Data diantaranya adalah :

  1. UI akan selalu mendapatkan data akurat, karena selalu meberikan notif jika ada perubahan.
  2. Tidak akan terjadi leak memory yang membuat applikasi berat bahkan bisa crash
  3. Applikasi tidak akan crash jika keluar/stop Activity
  4. Tidak ada lagi perubahan manual UI berkaitan dengan update data. karena data baru akan selalu dikirim.

Bagaimana cara implementasinya.

  1. Tambahkan di build.gradle
compile 'android.arch.lifecycle:extensions:1.0.0'

2. Gunakan live data untuk jika request ke database

@Query("SELECT * FROM Members")
LiveData<List<Members>> getAllMembers();

3. Data akan selalu diupdate jika ada perubahan

LiveData<List<Members>> liveDataMembers = daoMember.getAllMembers();

liveDataMembers.observe(MainActivity.this, new Observer<List<Members>>() {
@Override
public void onChanged(@Nullable List<Members> members) {

// Jika ada perubahan data, akan selalu tereksekusi
adapter.update(members);

}
});
Untuk sample code selengkapnya ada disini