Belajar Cara Menyimpan Data di Firebase Realtime Database


Assalamualaikum Warahmatullahi Wabarakatuh.

Firebase Realtime Database adalah database NoSQL yang digunakan untuk menyimpan, membaca, menulis dan mengambil data secara Realtime yang disingkronkan kepada klien yang terhubung. Database ini meyimpan data dengan menggunakan Format JSON.

Dengan menggunakan Firebase, walaupun klien tidak terkoneksi internet, klien dapat menerima setiap perubahan data yang ada, saat klien terkoneksi kembali dengan Internet, peristiwa realtime akan terus berlangsung, sehinggal user dapat pengalaman yang responsif.


Pada tutorial ini kita akan belajar membuat program sederhana untuk menyimpan data yang diinputkan user kedalam Database, data yang dimasukan bisa berupa String, Integer, Double, Boolean dsb.

Kita akan membuat program database sederhana yang berhubungan dengan Mahasiswa, anggap saja kita sebagai admin salah satu Universitas, jadi data yang akan dimasukan seperti NIM, Nama dan Jurusan.

Materi lainnya yang direkomendasikan:

Belajar Cara Menyimpan Data di Firebase Realtime Database

1) Pertama, tambahkan Firebase kedalam Project Aplikasi,Untuk Tutorialnya kalian bisa lihat Disini

2) Demi keamanan pengguna, Firebase menyarankan aturan, yaitu user diharuskan terautentikasi terlebih dahulu, yang bertujuan untuk menentukan user mana yang boleh menambahkan atau mengambil data, dengan begitu data akan aman, karena tidak sembarang user dapat mengakses database tersebut.

Disini kita hanya akan menggunakan Akun Google saja untuk methode masuknya. Buka Firebase konsol kalian, pada autentikasi/metode masuk, aktifkan Akun Google.



3) Untuk memudahkan programmer, Firebase menyediakan library Open Source bernama FirebaseUI, dengan library tersebut kita dapat menambahkan beberapa atau salah satu metode masuk dengan Antar Muka yang sudah disediakan.

Buka file build.gradle(module: app). tambahkan ketiga library berikut ini kedalam dependencies.
compile 'com.firebaseui:firebase-ui-auth:3.2.2'
compile 'com.google.android.gms:play-services-auth:11.8.0'
compile 'com.google.firebase:firebase-database:11.8.0'
Dan jangan lupa juga untuk menambahkan Internet Permission didalam file AndroidManifest.xml.
<uses-permission android:name="android.permission.INTERNET" />
4) Selanjutnya kita akan membuat class data_mahasiswa, class ini digunakan untuk meyimpan Tipe Data dan Variable untuk input yang akan dikirimkan ke Firebase. Kalian cukup membuatnya seperti berikut ini.
package cianjur.developer.net.firebaseexample;

public class data_mahasiswa {

    private String nim;
    private String nama;
    private String jurusan;

    //Membuat Method Getter (Wajib), Untuk mendapatkan data NIM, Nama dan Jurusan
    public String getNim() {
        return nim;
    }
    public String getNama() {
        return nama;
    }
    public String getJurusan() {
        return jurusan;
    }

    //Membuat Konstuktor kosong untuk membaca data snapshot
    public data_mahasiswa(){

    }

    public data_mahasiswa(String nim, String nama, String jurusan) {
        this.nim = nim;
        this.nama = nama;
        this.jurusan = jurusan;
    }
}
Jika kita hapus method Getter tersebut, maka data tidak akan tersimpan kedalam Database, dan akan mengakibatkan Error.

5) Buka activity_main.xml kalian, disini kita akan membuat layout untuk tampilan User Interfacenya, komponen yang digunakan seperti EditText (untuk input data) dan Button (Login, Simpan, Logout dan Lihat Data). Serta ProgressBar untuk menampilkan progress saat kita menunggu untuk masuk.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="12dp"
    tools:context="cianjur.developer.net.firebaseexample.MainActivity">

    <ProgressBar
        android:id="@+id/progress"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="false"
        android:layout_alignParentLeft="false"
        android:layout_alignParentRight="false"
        android:layout_alignParentStart="false"
        android:layout_alignParentTop="false"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical">

        <EditText
            android:id="@+id/nim"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="NIM"
            android:inputType="textPersonName" />

        <EditText
            android:id="@+id/nama"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="Masukan Nama"
            android:inputType="textPersonName" />

        <EditText
            android:id="@+id/jurusan"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="Jurusan"
            android:inputType="textPersonName" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:orientation="horizontal">

            <Button
                android:id="@+id/login"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Login" />

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

            <Button
                android:id="@+id/logout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Logout" />

        </LinearLayout>

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

    </LinearLayout>

</RelativeLayout>
View:


6) Buka file MainActivity.java kalian, pertama kita akan membuat fungsi login, logout, simpan serta mengecek keberadaan user yang terautentikasi menggunakan FirebaseUI. source codenya seperti berikut ini.
package cianjur.developer.net.firebaseexample;

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.firebase.ui.auth.AuthUI;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.util.Collections;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    //Deklarasi Variable
    private ProgressBar progressBar;
    private EditText NIM, Nama, Jurusan;
    private FirebaseAuth auth;
    private Button Logout, Simpan, Login, ShowData;
    private String getNIM, getNama, getJurusan;

    //Variable Untuk Meyimpan ID dari USER Yang Terautentikasi
    private String getUserID;

    private FirebaseDatabase database;
    private DatabaseReference getReference;

    //Membuat Kode Permintaan
    private int RC_SIGN_IN = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        progressBar = findViewById(R.id.progress);
        progressBar.setVisibility(View.GONE);

        //Inisialisasi ID (Button)
        Logout = findViewById(R.id.logout);
        Logout.setOnClickListener(this);
        Simpan = findViewById(R.id.save);
        Simpan.setOnClickListener(this);
        Login = findViewById(R.id.login);
        Login.setOnClickListener(this);
        ShowData = findViewById(R.id.showdata);
        ShowData.setOnClickListener(this);

        //Inisialisasi ID (EditText)
        NIM = findViewById(R.id.nim);
        Nama = findViewById(R.id.nama);
        Jurusan = findViewById(R.id.jurusan);

        database = FirebaseDatabase.getInstance(); // Mendapatkan Instance Firebase Realtime Database
        auth = FirebaseAuth.getInstance(); //Menghubungkan dengan Firebase Authentifikasi

        /*
         * Mendeteksi apakah ada user yang masuk, Jika tidak, maka setiap komponen UI akan dinonaktifkan
         * Kecuali Tombol Login. Dan jika ada user yang terautentikasi, semua fungsi/komponen
         * didalam User Interface dapat digunakan, kecuali tombol Logout
         */
        if(auth.getCurrentUser() == null){
            Logout.setEnabled(false);
            Simpan.setEnabled(false);
            ShowData.setEnabled(false);
            Login.setEnabled(true);
            NIM.setEnabled(false);
            Nama.setEnabled(false);
            Jurusan.setEnabled(false);
        }else {
           updateUI();
        }
    }

    private void updateUI(){
        Logout.setEnabled(true);
        Simpan.setEnabled(true);
        Login.setEnabled(false);
        ShowData.setEnabled(true);
        NIM.setEnabled(true);
        Nama.setEnabled(true);
        Jurusan.setEnabled(true);
        progressBar.setVisibility(View.GONE);

        //Mendapatkan User ID dari Akun Google yang Terautentikasi
        getUserID = auth.getCurrentUser().getUid();
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // RC_SIGN_IN adalah kode permintaan yang Anda berikan ke startActivityForResult, saat memulai masuknya arus.
        if (requestCode == RC_SIGN_IN) {

            //Berhasil masuk
            if (resultCode == RESULT_OK) {
                Toast.makeText(MainActivity.this, "Login Berhasil", Toast.LENGTH_SHORT).show();
                updateUI();
            }else {
                progressBar.setVisibility(View.GONE);
                Toast.makeText(MainActivity.this, "Login Dibatalkan", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.login:
                // Statement program untuk login/masuk
                break;
            case R.id.save:
                // Statement program untuk menyimpan data
                break;
            case R.id.logout:
                // Statement program untuk logout/keluar
                break;
            case R.id.showdata:
                //startActivity(new Intent(MainActivity.this, MyListData.class));
                break;
        }
    }
}
Pada method onClick(), kita akan menambahkan source code untuk autentikasi Akun Google memenggunakan FirebaseUI, didalam case R.id.login.
case R.id.login:
     // Statement program untuk login/masuk
     startActivityForResult(AuthUI.getInstance()
              .createSignInIntentBuilder()           

              //Memilih Provider atau Method masuk yang akan kita gunakan
              .setAvailableProviders(Collections.singletonList(new AuthUI.IdpConfig.GoogleBuilder().build()))
              .setIsSmartLockEnabled(false)
              .build(),
              RC_SIGN_IN);
     progressBar.setVisibility(View.VISIBLE);
     break;
Selanjutnya didalam didalam case R.id.save, kita akan menambahkan source code untuk menyimpan data pada Firebase.
case R.id.save:
      // Statement program untuk menyimpan data
      getNIM = NIM.getText().toString();
      getNama = Nama.getText().toString();
      getJurusan = Jurusan.getText().toString();
      getReference = database.getReference(); // Mendapatkan Data Referensi dari Database

      /Menyimpan data referensi pada Database berdasarkan User ID dari masing-masing Akun
      getReference.child("Admin").child(getUserID).child("Mahasiswa")
               .setValue(new data_mahasiswa(getNIM, getNama, getJurusan))
               .addOnSuccessListener(this, new OnSuccessListener() {
          @Override
          public void onSuccess(Void aVoid) {
              //Peristiwa ini terjadi saat user berhasil menyimpan datanya kedalam Database
              NIM.setText("");
              Nama.setText("");
              Jurusan.setText("");
              Toast.makeText(MainActivity.this, "Data Tersimpan", Toast.LENGTH_SHORT).show();
          }
      });
     break;
Penjelasan pada source code tersebut yaitu, pertama, ketiga variable (getNIM, getNama dan getJurusn) mendapatkan nilai yang dimasukan user.

Didalam database tersebut kita membuat child() baru, child tersebut digunakan untuk membuat lokasi penyimpanan serta untuk mengkategorikan data yang ingin dimasukan, kita juga dapat membuat child() didalam child(), child tersebut berperan layaknya folder/direktori.

Selanjutnya kita menggunakan fungsi push() untuk membuat kode unik, setiap user manambahkan data baru kedalam database, yang bertujuan untuk menghindari konflik yang mengakibatkan data rusak ketika ada user yang memasukan data secara bersamaan.

Untuk memasukan data kedalam database, kita menggunakan fungsi setValue(), dengan parameter yaitu class model yang sudah kita buat sebelumnya, setiap input dari user akan dimasukan kedalam parameter didalam class tersebut.

Selanjutnya didalam didalam case R.id.logout, kita akan menambahkan source code agar user dapat logout/keluar dari akun yang terauntetikasinya.
case R.id.logout:
     // Statement program untuk logout/keluar
     AuthUI.getInstance()
             .signOut(this)
             .addOnCompleteListener(new OnCompleteListener() {
                 @Override
                 public void onComplete(@NonNull Task task) {
                     Toast.makeText(MainActivity.this, "Logout Berhasil", Toast.LENGTH_SHORT).show();
                     finish();
                 }
             });
     break;
7) Terakhir, coba kalian jalankan project tersebut, coba simpan beberapa data, setelah itu buka Firebase Konsol, lalu buka Realtime Database, maka hasilnya akan seperti berikut ini.


Untuk dokumentasi lengkapnya, kalian bisa lihat disini.

Terimakasih atas kunjungannya, semoga tutorial yang saya berikan bisa bermanfaat untuk kalian semua, selebihnya, mohon maaf bila ada kesalahan.

Wassalamualaikum Warahmatullahi Wabarakatuh.

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