Belajar Membuat Fungsi Insert Data pada Room Database


Assalamualaikum Warahmatullahi Wabarakatuh.

Sebelumnya kita sudah membahas 2 materi mengenai Room Database, yaitu Cara meng-import library Room Database dan Membuat komponen entity, DAO, Database. pada seri ketiga ini kita akan membahas mengenai cara membuat atau manambahkan data baru pada Room Database dengan menggunakan fungsi Create/Insert.


Pada dasarnya Room Database hanyalah abstraction / interface yang memudahkan kita untuk membuat Database dibandingkan dengan menggunakan SQLite secara langsung. Perlu kalian ketahui, di bagian dalam layer Room Database adalah SQLite Database, jadi saya sarankan kalian sudah memahami konsep dasar mengenai SQLite.

Materi yang perlu kalian pelelajari sebelumnya:

Ok kita lanjutkan project sebelumnya, pada project tersebut kita hanya perlu menambahkan menu Input pada MainActivity, yaitu data-data mahasiswa yang akan dimasukan serta menambahkan beberapa baris kode pada Komponen Room Database.

Membuat Fungsi Create / Insert Data pada Room Database

1) Buka project Android Studio kalian, selanjutnya buka class MahasiswaDAO.java yang sudah kalian buat pada tutorial sebelumnya, pada class tersebut kita tambahkan fungsi/method insert seperti 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 com.wildan.crudroomdatabase.model.Mahasiswa;

@Dao
public interface MahasiswaDAO {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insertMahasiswa(Mahasiswa mahasiswa);
}
Coba kalian perhatikan, didalam interface tersebut kita tambahkan sebuah method bertipe data long, bernama insertMahasiswa, method ini gunakan untuk menambahkan data baru pada database, untuk itu kita perlu menggunakan Annotation @Insert.

Pada Annotation @Insert kita tambahkan parameter yaitu onConflict, parameter ini digunakan untuk menentukan Strategi saat konflik/penambahan data terjadi, disana kita memilih REPLACE, artinya jika data yang kita tambahkan sudah ada / exists, maka data yang lama / existing akan di-Replace dengan data yang baru ditambahkan.

2) Selanjutnya kita akan buat desain layout MainActivitynya, tapi sebalum itu kita tambahkan library material design berikut ini pada dependencies.
implementation 'com.android.support:design:27.1.1'
Kita perlu menambahkan library tersebut, karena kita akan menggunakan TextInputLayout TextInputEditext , untuk mendapatkan input dari 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.MainActivity">

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

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

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

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

    <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:checked="true"
            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"/>

    <Button
        android:id="@+id/show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Lihat Data"/>

</LinearLayout>
View:


Jika terdapat error seperti pada gambar berikut ini.


Untuk mengatasinya, pada folder values, buka file string.xml, lalu tambahkan baris kode berikut ini.
<item name="visible" type="id"/>
<item name="masked" type="id"/>
3) Berikutnya buka file MainActivity.java, disini kita masukan source code untuk input data kedalam Database menggunakan method insert yang sudah kita buat tadi.
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.Toast;

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

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    //Deklarasi Variable
    private TextInputEditText NIM, Nama, Jurusan, tanggalLahir;
    private AppDatabase database;
    private Button bSimpan, bLihatData;
    private RadioButton lakiLaki, perempuan;
    private String myJenisKelamin;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        NIM = findViewById(R.id.nim);
        Nama = findViewById(R.id.nama);
        Jurusan = findViewById(R.id.jurusan);
        tanggalLahir = findViewById(R.id.tanggal_lahir);
        lakiLaki = findViewById(R.id.laki_laki);
        perempuan = findViewById(R.id.perempuan);
        bSimpan = findViewById(R.id.save);
        bSimpan.setOnClickListener(this);
        bLihatData = findViewById(R.id.show);
        bLihatData.setOnClickListener(this);

        //Menentukan Jenis Kelamin pada Data Mahasiswa Baru
        if(lakiLaki.isChecked()){
            myJenisKelamin = "Laki-Laki";
        }else if (perempuan.isChecked()){
            myJenisKelamin = "Perempuan";
        }

        //Inisialisasi dan memanggil Room Database
        database = Room.databaseBuilder(
                getApplicationContext(),
                AppDatabase.class,
                "dbMahasiswa") //Nama File Database yang akan disimpan
                .build();
    }

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

            @Override
            protected void onPostExecute(Long status) {
                //Menandakan bahwa data berhasil disimpan
                Toast.makeText(MainActivity.this, "Status Row "+status, Toast.LENGTH_SHORT).show();
            }
        }.execute();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.save:

                //Mengecek Data NIM dan Nama
                if(NIM.getText().toString().isEmpty() || Nama.getText().toString().isEmpty()){
                    Toast.makeText(MainActivity.this, "NIM atau Nama TIdak Boleh Kosong", Toast.LENGTH_SHORT).show();
                }else {
                    //Membuat Instance/Objek Dari Class Entity Mahasisiwaa
                    Mahasiswa data = new Mahasiswa();

                    //Memasukan data yang diinputkan user pada database
                    data.setNim(NIM.getText().toString());
                    data.setNama(Nama.getText().toString());
                    data.setJurusan(Jurusan.getText().toString());
                    data.setTanggalLahir(tanggalLahir.getText().toString());
                    data.setJenisKelamin(myJenisKelamin);
                    insertData(data);

                    //Mengembalikan EditText menjadi seperti semula\
                    NIM.setText("");
                    Nama.setText("");
                    Jurusan.setText("");
                    tanggalLahir.setText("");
                }
                break;

            case R.id.show:
                startActivity(new Intent(MainActivity.this, ReadDataActivity.class));
                break;
        }
    }
}
Penjelasan:

Pertama kita deklarasikan beberapa variable yang dibuhkan, selanjutnya kita buat instance/objek untuk menghubungkan dengan Room Database, serta membuat database baru bernama "dbMahasiswa".

Selanjutnya pada method insertData() kita memanggil method insertMahasiswa(), melalui AppDatabase, untuk menambahkan data mahasiswa baru yang diinputkan oleh user.  Perlu kalian ketahui, Room Database Library adalah fungsi async yang tidak bisa dieksekusi pada main thread maka kita menggunakan AsyncTask untuk menjalankan fungsi tersebut.

AsyncTask  Memungkinkan kita 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 status dari Toast. 

Data-data yang di inputkan oleh user akan diterima melalui method setter dari Class Enity Mahasiswa.

Demo:


Jika kalian sudah menyelesaikan tutorialnya, mari kita lanjutnkan pada tutorial berikutnya mengenai Cara Menggunakan Fungsi Read 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.