Cara Membuat Fungsi Read Data pada Room Database


Assalamualaikum Warahmatullahi Wabarakatuh.

Seri ke 4 dari tutorial membuat aplikasi CRUD SQLite menggunakan Room Database Library. Pada tutorial sebelumnya kita sudah belajar bagaimana cara menambahkan /Insert data pada Database Room. Setelah user menambahkan data, pastinya kita perlu menampilkan hasil dari semua data yang tersimpan pada Database.


Untuk itu, pada tutorial ini kita akan belajar bagaimana cara membaca / Read data dari database,  data tersebut akan ditampilkan pada RecyclerView dalam bentuk list vartical. Data yang ditampilkan adalah NIM dan Nama, untuk menamilkan detail data seperti Jurusan, Tanggal Lahir dan Jenis Kelamin, akan dibahas pada Tutorial selanjutnya.

Materi yang perlu kalian pelajari sebelumnya:

Pada tutorial ini kita akan membuat Layout Activity baru, untuk menampilkan data tersimpan pada Database, serta penggunaan RecyclerViewAdapter untuk menentukan data apa saja yang akan ditampilkan pada RecyclerView.

Membuat Fungsi Read Data pada Room Database

1) Pertama kita tambahkan library berikut ini kedalam dependencies, karena kita akan menggunakan CardView pada item didalam RecyclerView tersebut.
implementation 'com.android.support:cardview-v7:27.1.1'
2) Untuk menggunakan fungsi Read Data pada Room Database, didalam interface DAO, kita perlu  membuat method baru dengan menambahkan Annotation @Query seperti berikut ini.
package com.wildan.crudroomdatabase.data;

//========== WILDAN TECHNO ART ==========//
//======= Cianjur Apps Developer ========//

import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.OnConflictStrategy;
import android.arch.persistence.room.Query;

import com.wildan.crudroomdatabase.model.Mahasiswa;

@Dao
public interface MahasiswaDAO {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insertMahasiswa(Mahasiswa mahasiswa);

    @Query("SELECT * FROM tMahasiswa")
    Mahasiswa[] readDataMahasiswa();
}
Pada Room Database kita juga dapat menggunakan Query SQLite seperti pada umunya, pada Query tersebut kita mengambil semua data yang terdapat pada tabel bernama "tMahasiswa".

3) Selanjutnya buat activity baru bernama "ReadDataActivity", activity ini digunakan untuk menampilkan data yang terdapat pada RecyclerView. didalam layout activity-nya, kita cukup menambahkan RecyclerView saja.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="14dp"
    tools:context="com.wildan.crudroomdatabase.ui.ReadDataActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/dataItem"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    
</RelativeLayout>
Jangan lupa pada class MainActivity.java, didalam button tambahkan listener berupa Intent untuk berpindah activity.
case R.id.show:
     startActivity(new Intent(MainActivity.this, ReadDataActivity.class));
     break;
4) Lalu buat layout baru, yaitu untuk desain RecyclerView-nya, didalam layout tersebut kita menggunakan 1 buah imageView dan 2  buah TextView.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.CardView
        android:id="@+id/cvMain"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_margin="8dp"
        app:cardCornerRadius="8dp"
        app:cardElevation="4dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="10dp"
            android:orientation="vertical">

            <ImageView
                android:id="@+id/gambar"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_marginEnd="10dp"
                android:layout_marginRight="10dp"
                app:srcCompat="@drawable/unpi" />

            <TextView
                android:id="@+id/nim"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_marginTop="3dp"
                android:layout_toEndOf="@+id/gambar"
                android:layout_toRightOf="@+id/gambar"
                android:textSize="16sp"
                android:textStyle="bold"
                tools:text="NIM" />

            <TextView
                android:id="@+id/nama"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/nim"
                android:layout_toEndOf="@+id/gambar"
                android:layout_toRightOf="@+id/gambar"
                android:text="Nama"
                android:textSize="15sp" />

        </RelativeLayout>
    </android.support.v7.widget.CardView>
</RelativeLayout>
View:


5) Jika sudah, buat sebuah adapter untuk RecyclerView-nya, buat class baru bernama "RecyclerMahasiswaAdapter", pada class ini kita mengatur bagaimana data akan tampil didalam RecyclerView, seperti Inisialisasi ArrayList, menentuan view yang akan digunakan dan mengambil data yang akan ditampilkan.
package com.wildan.crudroomdatabase.adapter;

import android.arch.persistence.room.Room;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.wildan.crudroomdatabase.R;
import com.wildan.crudroomdatabase.data.factory.AppDatabase;
import com.wildan.crudroomdatabase.model.Mahasiswa;

import java.util.ArrayList;

public class RecyclerMahasiswaAdapter extends RecyclerView.Adapter<RecyclerMahasiswaAdapter.ViewHolder> {

    //Deklarasi Variable
    private ArrayList<Mahasiswa> daftarMahasiswa;
    private AppDatabase appDatabase;
    private Context context;

    public RecyclerMahasiswaAdapter(ArrayList<Mahasiswa> daftarMahasiswa, Context context) {

        //Inisialisasi data yang akan digunakan
        this.daftarMahasiswa = daftarMahasiswa;
        this.context = context;
        appDatabase = Room.databaseBuilder(
                context.getApplicationContext(),
                AppDatabase.class, "dbMahasiswa").allowMainThreadQueries().build();
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        //Deklarasi View yang akan digunakan
        private TextView Nim, Nama;
        private CardView item;

        ViewHolder(View itemView) {
            super(itemView);
            Nim = itemView.findViewById(R.id.nim);
            Nama = itemView.findViewById(R.id.nama);
            item = itemView.findViewById(R.id.cvMain);
        }

    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //Inisialisasi Layout Item untuk RecyclerView
        View v =  LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_layout, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        //Deklarasi Variable untuk mendapatkan data dari Database melalui Array
        String getNIM = daftarMahasiswa.get(position).getNim();
        String getNama = daftarMahasiswa.get(position).getNama();

        //Menampilkan data berdasarkan posisi Item dari RecyclerView
        holder.Nim.setText(getNIM);
        holder.Nama.setText(getNama);
    }

    @Override
    public int getItemCount() {
        //Menghitung data / ukuran dari Array
        return daftarMahasiswa.size();
    }
}
6) Selanjutnya buka class ReadDataActivity.java kalian, disini kita akan memsang atribut-artibut yang diperlukan RecyclerView seperti adapter dan Data Array dari Database.
package com.wildan.crudroomdatabase.ui;

import android.arch.persistence.room.Room;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import com.wildan.crudroomdatabase.R;
import com.wildan.crudroomdatabase.adapter.RecyclerMahasiswaAdapter;
import com.wildan.crudroomdatabase.data.factory.AppDatabase;
import com.wildan.crudroomdatabase.model.Mahasiswa;

import java.util.ArrayList;
import java.util.Arrays;

public class ReadDataActivity extends AppCompatActivity {

    //Deklarasi Variable
    private RecyclerView recyclerView;
    private RecyclerView.Adapter adapter;
    private RecyclerView.LayoutManager layoutManager;
    private AppDatabase database;
    private ArrayList<Mahasiswa> daftarMahasiswa;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_read_data);
        getSupportActionBar().setTitle("Daftar Mahasiswa");

        //Inisialisasi ArrayList
        daftarMahasiswa = new ArrayList<>();

        //Inisialisasi RoomDatabase
        database = Room.databaseBuilder(getApplicationContext(),
                AppDatabase.class, "dbMahasiswa").allowMainThreadQueries().build();

        /*
         * Mengambil data Mahasiswa dari Database
         * lalu memasukannya ke kedalam ArrayList (daftarMahasiswa)
         */
        daftarMahasiswa.addAll(Arrays.asList(database.mahasiswaDAO().readDataMahasiswa()));

        //Agar ukuran RecyclerView tidak berubah
        recyclerView.setHasFixedSize(true);
        
        //Menentukan bagaimana item pada RecyclerView akan tampil
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        
        //Mamasang adapter pada RecyclerView
        adapter = new RecyclerMahasiswaAdapter(daftarMahasiswa, ReadDataActivity.this);
        recyclerView.setAdapter(adapter);
    }
}
Seperti pada class adapter sebelumnya, pada didalam Room Database kita menggunakan fungsi allowMainThreadQueries() supaya kita dapat menjalankan fungsi Read Data di Main Thread.

Demo:


Mari kita lanjutnkan pada tutorial berikutnya mengenai Cara Membuat Fungsi Edit pada Room Database. Sekian dari saya, mohon maaf bila ada kesalahan, jika ada yang ingin ditanyaka, silakan isi kolom komentar dibawah ini.

Wassalamualaikum Warahmatullahi Wabarakatuh.

Wildan M Athoillah
Wildan M Athoillah Blogger dan spesialis pembuat aplikasi android.