Cara Membuat Fungsi Edit Data pada Room Database


Assalamualaikum Warahmatullahi Wabarakatuh.

Pada seri ke 5 mengenai tutorial membuat aplikasi CRUD menggunakan Room Database, di seri ini kita akan belajar cara menggunakan fungsi edit data pada Room Database. Seperti SQLite pada umumnya, didalam Room Databas kita juga dapat mengubah data sebelumnya menjadi data yang baru hanya saja pada Room Database penggunaan Edit data lebih mudah dan fleksibel dibandingkan dengan SQLite secara langsung.


Disini kita akan melanjutkan tutorial sebelumnya mengenai penggunaan fungsi read data pada Room Database. karena tutorial ini berkaitan erat dengan tutorial yang pernah saya posting sebelumnya, jadi saya sarankan kalian sudah mengikuti materi / tutorial tersebut.

Materi yang harus kalian pelajari sebelumnya:

Untuk membuat fungsi Update Data, pada project ini pertama kita akan membuat layout activity baru untuk proses editing data, activity ini akan menerima data yang telah dipilih oleh user lalu user dapat mengubah data tersebut didalam activity tersebut lalu menyimpannya kembali.

Cara Membuat Fungsi Edit Data pada Room Database

1) Pertama buka kembali interface MahasiswaDAO.java, disini kita tambahkan method baru bernama updateMahasiswa().
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 android.arch.persistence.room.Update;

import com.wildan.crudroomdatabase.model.Mahasiswa;

@Dao
public interface MahasiswaDAO {

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

    @Query("SELECT * FROM tMahasiswa")
    Mahasiswa[] readDataMahasiswa();

    @Update
    int updateMahasiswa(Mahasiswa mahasiswa);
}
Pada method tersebut kita tambahkan Annotation @Update bawaan dari library Room Database, method ini berfungsi untuk mengedit data didalam Database.

2) Jika sudah, selanjutnya buat activity baru bernama EditActivity, activity ini digunakan sebagai form edit dari data yang akan diubah oleh user.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="16dp"
    android:orientation="vertical"
    tools:context="com.wildan.crudroomdatabase.ui.EditActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Edit Data"
        android:textSize="18sp"
        android:textStyle="bold" />

    <android.support.design.widget.TextInputLayout
        android:id="@+id/input_layout2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/nama"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Nama" />

    </android.support.design.widget.TextInputLayout>

    <android.support.design.widget.TextInputLayout
        android:id="@+id/input_layout3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/jurusan"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Jurusan" />

    </android.support.design.widget.TextInputLayout>

    <android.support.design.widget.TextInputLayout
        android:id="@+id/input_layout4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/tanggal_lahir"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Tanggal lahir" />

    </android.support.design.widget.TextInputLayout>

    <RadioGroup
        android:id="@+id/jenis_kelamin"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="4dp"
        android:layout_marginTop="4dp"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/laki_laki"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Laki Laki" />

        <RadioButton
            android:id="@+id/perempuan"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:layout_marginStart="8dp"
            android:text="Perempuan" />

    </RadioGroup>

    <Button
        android:id="@+id/save"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Simpan"/>

</LinearLayout>
View:


Tampilannya mirip dengan Activity untuk input data, hanya saja disini kita menghilangkan NIM, karena NIM sebagai Primary Key tidak akan kita ubah.

3) Berikutnya buka class adapter kalian bernama RecyclerMahasiswaAdapter.java, disini kita tambahkan method baru bernama onEditData serta tambahkan onLongClickListener pada widget CardView,  sehingga saat user menekan salah satu item maka akan muncul menu pilihan yatu Edit dan Delete.
@SuppressLint("RecyclerView")
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {

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

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

    holder.item.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            CharSequence[] menuPilihan = {"Edit", "Delete"};
            AlertDialog.Builder dialog = new AlertDialog.Builder(v.getContext())
                    .setTitle("Pilih Aksi")
                    .setItems(menuPilihan, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            switch (which){
                                case 0:
                                    /*
                                     Menjalankan Perintah Edit Data
                                     Menggunakan Bundle untuk mengambil data yang akan Diedit
                                     */
                                    onEditData(position, context);
                                    break;

                                case 1:
                                    /*
                                     Menjalankan Perintah Delete Data
                                     Akan dibahas pada Tutorial selanjutnya
                                     */
                                    break;
                            }
                        }
                    });
            dialog.create();
            dialog.show();
            return true;
        }
    });
}

//Mengirim Data yang akan diedit dari ArrayList berdasarkan posisi item pada RecyclerView
private void onEditData(int position, Context context){
    context.startActivity(new Intent(context, EditActivity.class).putExtra("data", daftarMahasiswa.get(position)));
    ((Activity)context).finish();
}
Didalam metho onEditData(), kita akan mengirim data mahasiswa yang dipilih oleh user menggunakan Intent pada EditDataActivity.

Lalu didalam onLongClickListener, disini kita menggunkan AlertDialog.Builder untuk menampilkan menu pilihan berupa Edit dan Delete, saat menu Edit di klik maka method onEditData akan berjalan dan menuju form activity untuk edit data.

4) Terakhir buka class EdtActivity.java, disini kita akan memanggil method updateMahasiswa(), untuk mengedit data yang diubah.
package com.wildan.crudroomdatabase.ui;

import android.annotation.SuppressLint;
import android.arch.persistence.room.Room;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.design.widget.TextInputEditText;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

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

public class EditActivity extends AppCompatActivity {

    //Deklarasi Variable
    private TextInputEditText Nama, Jurusan, tanggalLahir;
    private AppDatabase database;
    private Button bSimpan;
    private RadioButton lakiLaki, perempuan;
    private RadioGroup jenisKelamin;
    private String myJenisKelamin;
    private Mahasiswa mahasiswa;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit);
        Nama = findViewById(R.id.nama);
        Jurusan = findViewById(R.id.jurusan);
        tanggalLahir = findViewById(R.id.tanggal_lahir);
        jenisKelamin = findViewById(R.id.jenis_kelamin);
        lakiLaki = findViewById(R.id.laki_laki);
        perempuan = findViewById(R.id.perempuan);
        bSimpan = findViewById(R.id.save);

        database = Room.databaseBuilder(getApplicationContext(),
                AppDatabase.class, "dbMahasiswa").build();

        //Menampilkan data mahasiswa yang akan di edit
        getDataMahasiswa();

        bSimpan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mahasiswa.setNama(Nama.getText().toString());
                mahasiswa.setJurusan(Jurusan.getText().toString());
                mahasiswa.setTanggalLahir(tanggalLahir.getText().toString());
                mahasiswa.setJenisKelamin(myJenisKelamin);
                updateData(mahasiswa);
            }
        });
    }

    //Method untuk menapilkan data mahasiswa yang akan di edit
    private void getDataMahasiswa(){
        //Mendapatkan data dari Intent
        mahasiswa = (Mahasiswa)getIntent().getSerializableExtra("data");

        Nama.setText(mahasiswa.getNama());
        Jurusan.setText(mahasiswa.getJurusan());
        tanggalLahir.setText(mahasiswa.getTanggalLahir());
        switch (mahasiswa.getJenisKelamin()){
            case "Laki-Laki":
                lakiLaki.setChecked(true);
                myJenisKelamin = "Laki-Laki";
                break;

            case "Perempuan":
                perempuan.setChecked(true);
                myJenisKelamin = "Perempuan";
                break;
        }
    }

    //Menjalankan method Update Data
    @SuppressLint("StaticFieldLeak")
    private void updateData(final Mahasiswa mahasiswa){
        new AsyncTask<Void, Void, Integer>() {
            @Override
            protected Integer doInBackground(Void... voids) {
                //Menjalankan proses insert data
                return database.mahasiswaDAO().updateMahasiswa(mahasiswa);
            }

            @Override
            protected void onPostExecute(Integer status) {
                //Menandakan bahwa data berhasil disimpan
                Toast.makeText(EditActivity.this, "Data Berhasil Diubah", Toast.LENGTH_SHORT).show();
                startActivity(new Intent(EditActivity.this, ReadDataActivity.class));
                finish();
            }
        }.execute();
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        startActivity(new Intent(EditActivity.this, ReadDataActivity.class));
        finish();
    }
}
Seperti pada saat input data, pada class ini juga kita menggunakan AsyncTask  untuk manjalankan program di latar belakang layar dan mempublikasukan hasilnya. AsyncTask  Ini kita gunakan untuk memantau proses saat user menyimpan data baru, jika data berhasil disimpan maka akan muncul pesan Toast.

Demo:






Di seri berikutnya akan membahas mengenai Cara Membuat Fungsi Delete Data 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.