Persiapan
Modul ini akan membahas penerapan CRUD pada Firebase Realtime Database. Pada modul
sebelumnya sudah diberikan contoh bagaimana Android menyimpan data secara lokal pada perangkat
menggunakan SQLite. SQLite yang bersifat lokal membuat data sulit diakses melalui perangkat lain
atau aplikasi lain.
Firebase sendiri merupakan layanan yang disediakan Google dan menyediakan beragam fitur. Selain
itu, Firebase juga tersedia Paket Spark yang gratis, sehingga dapat digunakan untuk belajar bahkan
untuk para developer skala kecil. Realtime Database merupakan salah satu fitur dengan kuota gratis
yang cukup besar, hingga 1 GB data tersimpan dan 100 koneksi simultan. Sehingga, kita dapat
membuat aplikasi dengan database online yang memungkinkan diakses dari mana saja (dengan akses
internet tentunya) dan dari berbagai platform aplikasi.
Untuk dapat menambahkan Firebase ke project Android, beberapa prasyarat berikut perlu
diperhatikan:
Modul ini menggunakan studi kasus Aplikasi Inventori Sederhana untuk memudahkan pemahaman
tentang tahapan pembuatan aplikasi. Berikut persiapan yang perlu dilakukan terlebih dahulu.
Menambahkan Firebase
1. Buat project baru, pilih Basic Activity, beri nama FirebaseInventori dan minimum SDK adalah Jelly
Bean. Tunggu hingga project selesai di-built.
2. Kemudian pilih Tools › Firebase.
3. Pada kolom Firebase Assistant di sisi kanan, ditampilkan seluruh layanan Firebase yang dapat
digunakan. Gulung hingga menjumpai fitur Realtime Database dan klik tautan “Save and retrieve
data”.
Google Analytics digunakan apabila anda ingin memanfaatkan fitur-fitur yang disediakan untuk
pengembangan aplikasi. Karena aplikasi contoh ini bersifat sederhana maka fitur ini dimatikan.
Klik Buat project untuk melanjutkan. Tunggu hingga Firebase selasi menyiapkan project anda. Klik
Lanjutkan jika sudah tampil informasi seperti gambar berikut.
6. Kemudian Hubungkan project di Android Studio dengan Firebase.
7. Setelah koneksi berhasil, kembali ke Android Studio untuk melanjutkan langkah berikutnya, klik
Add the Realtime Database to your app.
8. Klik Accept Changes agar Android Studio menambahkan plugin dan pustaka yang diperlukan.
Tunggu hingga Gradle selesai melakukan sinkronisasi.
9. Setelah proses build selesai, selanjutnya adalah langkah ke-3, Configure Database Rules. Bagian ini
harus dilakukan dengan cara masuk ke konsol Firebase melalui browser. Kemudian pilih Project
Firebase yang akan dikonfigurasi.
10. Pilih Database dan gulung hingga bertemu dengan Realtime Database. Klik Buat database.
11. Pilih Mulai dalam mode pengujian dan klik Aktifkan. Mode pengujian ini untuk mempermudah
penyiapan database, tidak dianjurkan untuk produksi.
12. Sampai proses ini Realtime Database sudah siap menerima data. Biarkan jendela konsol Firebase
tetap terbuka, terutama saat anda melakukan proses CRUD. Realtime Database akan secara
otomatis diperbarui saat ada perubahan-perubahan pada data di dalamnya.
Menambahkan Aset Gambar
Tambahkan juga beberapa aset yang sudah disediakan pada bahan_modul12.zip. Ekstrak dan salin ke
dalam folder drawable seperti pada materi sebelumnya.
Mengatur Resource
colors.xml
Warna-warna disesuaikan dengan ikon dan standar Firebase.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#FFCA28</color>
<color name="colorPrimaryDark">#FFA000</color>
<color name="colorAccent">#F57C00</color>
<color name="biruFirebase">#039BE5</color>
<color name="biruDongker">#2C384A</color>
<color name="coralFirebase">#FF8A65</color>
<color name="abuFirebase">#ECEFF1</color>
</resources>
public Barang() {
}
Layout: tambah_edit.xml
Buat sebuah Layout Resource File dan beri nama tambah_edit.xml dan edit skripnya seperti berikut:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="5dp"
android:layout_marginHorizontal="5dp"
android:id="@+id/etNama"
android:hint="Nama Barang"
android:inputType="text"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="5dp"
android:layout_marginHorizontal="5dp"
android:id="@+id/etMerk"
android:hint="Merk"
android:inputType="text"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="5dp"
android:layout_marginHorizontal="5dp"
android:id="@+id/etHarga"
android:hint="Harga"
android:inputType="number"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="5dp"
android:id="@+id/btnSimpan"
android:text="Simpan"/>
</LinearLayout>
CreateActivity.java
Berikutnya membuat activity untuk memasukkan data ke Realtime Database. Buatlah sebuah Java
Class baru yang meng-extends AppCompatActivity.
Kemudian daftarkan CreateActivity ke dalam AndroidManifest dengan cara posisikan kursor pada
nama kelas kemudian alt+enter dan pilih Add activity to manifest. Perhatikan gambar berikut.
Menambahkan activity ke dalam file AndroidManifest.xml juga dapat dilakukan secara manual,
mengetikkan nama activity-nya.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tambah_edit);
setTitle("Tambah Data");
etNama = findViewById(R.id.etNama);
etMerk = findViewById(R.id.etMerk);
etHarga = findViewById(R.id.etHarga);
Button btnSimpan = findViewById(R.id.btnSimpan);
btnSimpan.setText("Simpan");
//ambil referensi ke Firebase
database = FirebaseDatabase.getInstance().getReference();
//fungsikan btnSimpan
btnSimpan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if( !isEmpty(etNama.getText().toString())
&& !isEmpty(etMerk.getText().toString())
&& !isEmpty(etHarga.getText().toString()) ){
//simpanBarang
String brgNama = etNama.getText().toString();
String brgMerk = etMerk.getText().toString();
String brgHarga = etHarga.getText().toString();
InputMethodManager imm =
(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(etNama.getWindowToken(),0);
}
});
}
}
Edit: MainActivity.java
Kita manfaatkan Floating Action Button atau FAB untuk memanggil CreateActivity. Edit skrip pada
bagian ini
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//panggil CreateActivity ketika FAB di-tap
Intent intent = new Intent(MainActivity.this, CreateActivity.class);
startActivity(intent);
}
});
Uji Coba
Run project ke AVD atau ke perangkat, tap FAB dan isikan data pada form kemudian tap button
Simpan.
Periksa juga di konsol Firebase dan perhatikan tambahan data yang baru saja dibuat.
AndroidManifest.xml
Jika dijumpai error atau data tidak dapat ditambahkan, kemungkinan penyebabnya adalah ijin akses
internet perlu diberikan pada aplikasi.
Tambahkan ijin akses internet pada file AndroidManifest.xml berikut ini dan letakkan tepat di atas tag
<application>.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.snazzyapp">
<uses-permission android:name="android.permission.INTERNET"/>
<!-- other permissions go here -->
<application ...>
...
</application>
</manifest>
Membuat Fitur Retrieve
Fitur ini akan menempati halaman pertama yang menggunakan layout activity_main.xml. Dalam
layout ini akan memuat RecyclerView untuk menampung daftar barang dan efek saat belum ada data
pada Realtime Database.
Layout: baris_barang.xml
Buat sebuah Layout Resource File dan beri nama baris_barang.xml. Kemudian edit skripnya seperti
berikut.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="10dp"
android:layout_marginVertical="10dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tvNama"
android:textSize="16sp"
android:fontFamily="sans-serif-light" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/abuFirebase"/>
</LinearLayout>
Edit: content_main.xml
Edit skripnya seperti berikut untuk dapat memuat RecyclerView.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.recyclerview.widget.RecyclerView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/rvBarang"
android:scrollbars="vertical"/>
</LinearLayout>
@NonNull
@Override
public AdapterRvBarang.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.baris_barang, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull AdapterRvBarang.ViewHolder holder, int position) {
//menampilkan data pada view
final String namaBrg = daftarBarang.get(position).getNama();
@Override
public boolean onLongClick(View v) {
//skrip untuk menampilkan pilihan Edit-Delete di bawah sini
return false;
}
});
holder.tvNama.setText(namaBrg);
}
@Override
public int getItemCount() {
return daftarBarang.size();
}
Edit: MainActivity.java
MainActivity adalah activity pertama yang ditampilkan saat aplikasi dijalankan. Di sini, MainActivity
akan menampilkan daftar barang yang di-retrieve dari Firebase Realtime Database.
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
recyclerView = findViewById(R.id.rvBarang);
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
//inisialisasi Firebase
database = FirebaseDatabase.getInstance().getReference();
//inisialisasi adapter
adapter = new AdapterRvBarang(daftarBarang, MainActivity.this);
recyclerView.setAdapter(adapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
//skrip ketika ada error, tampilkan di logcat
System.out.println(databaseError.getDetails() + " " + databaseError.getMessage());
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Uji Coba
Run project ke AVD atau ke perangkat, jangan lupa untuk terhubung ke internet agar proses retrieve
berlangsung dengan baik. Hasilnya kurang lebih seperti berikut.
Membuat Fitur Update
Fitur berikutnya adalah untuk memperbarui data atau update. Cara kerja fitur ini, data barang yang
akan di-edit ditampilkan pada form, di-edit seperlunya, kemudian di-simpan kembali ke Realtime
Database.
Layout tampilan akan menggunakan file tambah_edit.xml. Buatlah sebuah Java Class, beri nama
UpdateActivity.java dan meng-extends AppCompatActivity.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tambah_edit);
getSupportActionBar().setTitle("Edit Data");
etNama = findViewById(R.id.etNama);
etMerk = findViewById(R.id.etMerk);
etHarga = findViewById(R.id.etHarga);
Button btnSimpan = findViewById(R.id.btnSimpan);
btnSimpan.setText("Perbarui");
btnSimpan.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
barang.setNama(etNama.getText().toString());
barang.setMerk(etMerk.getText().toString());
barang.setHarga(etHarga.getText().toString());
Edit: AdapterRvBarang.java
Edit pada bagian berikut ini.
//setOnLongClickListener pada tiap data
holder.tvNama.setOnLongClickListener(new View.OnLongClickListener(){
@Override
public boolean onLongClick(View v) {
//skrip untuk menampilkan pilihan Edit-Delete di bawah sini
CharSequence[] opsi = new CharSequence[]{"Edit", "Hapus"};
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Pilih Aksi");
builder.setItems(opsi, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if( which == 0 ){
//tampilkan UpdateActivity
Intent intent = new Intent(context, UpdateActivity.class);
intent.putExtra("data", daftarBarang.get(position));
context.startActivity(intent);
} else {
//skrip delete di bawah sini
}
}
});
builder.show();
return true;
}
});
Uji Coba
Jalankan kembali project ke AVD atau ke perangkat android yang digunakan. Hasilnya kurang lebih
seperti berikut ini. Cek juga perubahan pada Realtime Database melalui konsol Firebase.
Membuat Fitur Delete
Selanjutnya adalah fitur untuk menghapus data dari Realtime Database. Edit beberapa file berikut.
Edit: AdapterRvBarang.java
Tambahkan 2 (dua) baris perintah di bawah teks //skrip delete di bawah sini seperti ditunjukkan
pada potongan skrip berikut.
//skrip delete di bawah sini
dialog.dismiss();
listener.onDeleteData(daftarBarang.get(position), position);
Edit: MainActivity.java
Tambahkan implements AdapterRvBarang.FirebaseDataListener pada class MainActivity. Dan buat
method onDeleteData. Perhatikan perubahan (yang berwarna merah) pada skrip MainActivity berikut.
public class MainActivity extends AppCompatActivity
implements AdapterRvBarang.FirebaseDataListener {
private DatabaseReference database;
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
private ArrayList<Barang> daftarBarang;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
recyclerView = findViewById(R.id.rvBarang);
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
//inisialisasi Firebase
database = FirebaseDatabase.getInstance().getReference();
//inisialisasi adapter
adapter = new AdapterRvBarang(daftarBarang, MainActivity.this);
recyclerView.setAdapter(adapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
//skrip ketika ada error, tampilkan di logcat
System.out.println(databaseError.getDetails() + " " + databaseError.getMessage());
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onDeleteData(Barang barang, int position) {
if( database != null ){
database.child("barang")
.child(barang.getKey())
.removeValue()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Snackbar.make(recyclerView, "Data berhasil dihapus",
Snackbar.LENGTH_SHORT).show();
}
});
}
}
}
Uji Coba
Run project ke AVD atau perangkat android, coba hapus dengan tap-lama (long click) pada salah satu
data, kemudian pilih Hapus. Jika data terhapus, maka data tidak akan ditampilkan dan muncul
snackbar di bawah layar seperti berikut.
Membuat Fitur Detail View
Sebagaimana sudah dibuat, RecyclerView hanya menampilkan nama barang. Fitur berikutnya yang
perlu dibuat adalah untuk menampilkan detil data barang ketika nama barang di-tap.
Layout: activity_detail.xml
Edit skripnya seperti berikut.
<?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:orientation="vertical"
android:padding="10dp"
tools:context=".DetailActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:textColor="@color/colorPrimary"
android:fontFamily="sans-serif-medium"
android:text="Nama Barang"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tvNama"
android:textSize="24sp"
android:layout_marginBottom="20dp"
android:text="Nama Barang"
android:fontFamily="sans-serif-light"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:textColor="@color/colorPrimary"
android:fontFamily="sans-serif-medium"
android:text="Merk Barang"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tvMerk"
android:textSize="24sp"
android:layout_marginBottom="20dp"
android:text="Merk Barang"
android:fontFamily="sans-serif-light"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
android:textColor="@color/colorPrimary"
android:fontFamily="sans-serif-medium"
android:text="Harga Barang"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tvHarga"
android:textSize="24sp"
android:layout_marginBottom="20dp"
android:text="Harga Barang"
android:fontFamily="sans-serif-light"/>
</LinearLayout>
DetailActivity.java
Lengkapi skripnya seperti berikut.
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
Edit: AdapterRvBarang.java
Tambahkan skrip di bawah teks //skrip untuk menampilkan detil barang di bawah ini. Skrip ini
berfungsi untuk mengirimkan data yang akan ditampilkan di DetailActivity.
//skrip untuk menampilkan detil data barang di bawah ini
Intent intent = new Intent(context, DetailActivity.class);
intent.putExtra("data", daftarBarang.get(position));
context.startActivity(intent);
Uji Coba
Setelah selesai di-edit, periksa kembali skripnya untuk memastikan tidak ada error. Jalankan project ke
AVD atau ke perangkat untuk menguji keberhasilan skrip. Jika benar, tampilannya kurang lebih seperti
berikut.
Anda dapat menghapus beberapa file yang tidak digunakan seperti file-file fragment dan layout-nya.
Begitu pula folder navigation beserta isinya.
Tantangan
Ada beberapa hal yang dapat ditambahkan pada aplikasi ini, misalnya: