Firebase sebagai salah satu MBaaS (Mobile Backend as a Service) mengalami perubahan besar-besaran pada May 2016, dengan versi terakhirnya dinamakan Firebase 3.0. Dibandingkan sebelumnya yang mana fungsi Firebase terbatas pada authentication service dan real-time database saja, kali ini Firebase memiliki hampir seluruh fungsi yang dibutuhkan sebagai backend service dari Mobile Application.
Pada kesempatan kali ini, saya akan memberikan tutorial CRUD (Create, Read, Update dan Delete) pada Aplikasi Android dengan Database Firebase, tutorial ini mulai dari pembuatan database sampai dengan Pembuatan Aplikasi.
Persiapan yang diperlukan :
- Database Firebase
- Android Studio
3. Pilih GET STARTED
4. Bila Sobat blm buat project sebelumnya, pilih "Add project"
5. Sekarang menambahkan Aplikasi Android kedalam Firebird, kita harus mendaftarkan aplikasi kita terlebih dahulu, pilih menu "+ Add app"
6. Pilih Platform sobat, karena kita menggunakan android, maka pilih android platform
7. Pada Register app, masukkan package dari Aplikasi sobat serta nama aplikasi yang dibuat, kemudian pilih "Register app"
8. Selanjutnya kita disuruh untuk mengunduh "google-services.json", unduh kemudian copy ke "nama_project/app/(paste disini)"
9. Sekarang Tambahkan SDK Firebase pada "Gradle Script" di Android Studio, tambahkan code pada gambar di :
- build.gradle (Project)
- build.gradle (Modul:app)
10. Selanjutnya jalankan Aplikasi program pada Android Studio untuk melihat sudah terkoneksi dengan Firebase atau belum. Jika sudah maka tampilan akan berubah seperti gambar dibawah.
11. Kemudian kita perpindah ke Android Studio, pada "activity_main.xml" ketikan Source Code dibawah ini.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context="com.example.aoxa.tugasakhirmc.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/edtName"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btnSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Simpan"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Daftar Pengguna"
android:layout_marginTop="20px"
android:layout_marginBottom="20px"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/black"/>
<ListView
android:id="@+id/listViewUsers"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
<android.support.constraint.ConstraintLayout 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"
tools:context="com.example.aoxa.tugasakhirmc.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/edtName"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btnSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Simpan"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Daftar Pengguna"
android:layout_marginTop="20px"
android:layout_marginBottom="20px"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/black"/>
<ListView
android:id="@+id/listViewUsers"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
Tampilan activity_main.xml
12.Selanjutnya buat layout baru, beri nama dengan "layout_user_list", beri source code seperti dibawah ini.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txtName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
<Button
android:id="@+id/btnUpdate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ubah"/>
<Button
android:id="@+id/btnDelete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hapus"/>
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/txtName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
<Button
android:id="@+id/btnUpdate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ubah"/>
<Button
android:id="@+id/btnDelete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hapus"/>
</LinearLayout>
Tampilan layout_user_list.xml
13. Setelah activity selesai dibuat, kemudian buat Class Java baru dengan cara, klik kanan package pada java kemudian beri nama "User", setelah itu beri constructor, getter and setter, atau sobat bisa copy-paste code dibawah.
package com.example.aoxa.tugasakhirmc;
public class User {
private String id;
private String name;
public User() {
}
public User(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class User {
private String id;
private String name;
public User() {
}
public User(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
14. Kemudian buat Class java lagi seperti seblumnya dan beri nama "UserList", ketik kode seperti dibawah ini
package com.example.aoxa.tugasakhirmc;
import android.app.Activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import com.google.firebase.database.DatabaseReference;
import java.util.List;
public class UserList extends ArrayAdapter<User> {
private Activity context;
private List<User> users;
DatabaseReference databaseReference;
EditText edtName;
public UserList(@NonNull Activity context, List<User> users, DatabaseReference databaseReference, EditText edtName ) {
super(context, R.layout.layout_user_list, users);
this.context = context;
this.users = users;
this.databaseReference = databaseReference;
this.edtName = edtName;
}
public View getView (int pos, View view, ViewGroup parent){
LayoutInflater inflater = context.getLayoutInflater();
View lisViewItem =inflater.inflate(R.layout.layout_user_list, null, true);
TextView txtName = (TextView) lisViewItem.findViewById(R.id.txtName);
Button btnDelete = (Button) lisViewItem.findViewById(R.id.btnDelete);
Button btnUpdate = (Button) lisViewItem.findViewById(R.id.btnUpdate);
final User user = users.get(pos);
txtName.setText(user.getName());
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
databaseReference.child(user.getId()).removeValue();
}
});
btnUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
edtName.setText(user.getName());
MainActivity.userId = user.getId();
}
});
return lisViewItem;
}
}
import android.app.Activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import com.google.firebase.database.DatabaseReference;
import java.util.List;
public class UserList extends ArrayAdapter<User> {
private Activity context;
private List<User> users;
DatabaseReference databaseReference;
EditText edtName;
public UserList(@NonNull Activity context, List<User> users, DatabaseReference databaseReference, EditText edtName ) {
super(context, R.layout.layout_user_list, users);
this.context = context;
this.users = users;
this.databaseReference = databaseReference;
this.edtName = edtName;
}
public View getView (int pos, View view, ViewGroup parent){
LayoutInflater inflater = context.getLayoutInflater();
View lisViewItem =inflater.inflate(R.layout.layout_user_list, null, true);
TextView txtName = (TextView) lisViewItem.findViewById(R.id.txtName);
Button btnDelete = (Button) lisViewItem.findViewById(R.id.btnDelete);
Button btnUpdate = (Button) lisViewItem.findViewById(R.id.btnUpdate);
final User user = users.get(pos);
txtName.setText(user.getName());
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
databaseReference.child(user.getId()).removeValue();
}
});
btnUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
edtName.setText(user.getName());
MainActivity.userId = user.getId();
}
});
return lisViewItem;
}
}
15. Lalu pada "MainActivity", implementasikan Source Code di bawah ini, saya rekomendasikan untuk mengetik manual, selain sobat akan paham, juga dapat menghindari error.
package com.example.aoxa.tugasakhirmc;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
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;
import java.util.List;
public class MainActivity extends AppCompatActivity {
Button btnSave;
EditText edtName;
DatabaseReference databaseReference;
ListView listViewUsers;
List<User> users;
public static String userId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
users = new ArrayList<User>();
databaseReference = FirebaseDatabase.getInstance().getReference("users");
btnSave = (Button) findViewById(R.id.btnSave);
edtName = (EditText) findViewById(R.id.edtName);
listViewUsers = (ListView) findViewById(R.id.listViewUsers);
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = edtName.getText().toString();
if(TextUtils.isEmpty(userId)) {
//save
String id = databaseReference.push().getKey();
User user = new User(id, name);
databaseReference.child(id).setValue(user);
Toast.makeText(MainActivity.this, "Berhasil buat user", Toast.LENGTH_SHORT).show();
}else {
//update
databaseReference.child(userId).child("name").setValue(name);
Toast.makeText(MainActivity.this, "Berhasil ubah user", Toast.LENGTH_LONG).show();
}
edtName.setText(null);
}
});
}
@Override
protected void onStart() {
super.onStart();
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
users.clear();
for (DataSnapshot postSnapshot: dataSnapshot.getChildren()){
User user = postSnapshot.getValue(User.class);
users.add(user);
}
UserList userAdapter = new UserList(MainActivity.this, users, databaseReference, edtName);
listViewUsers.setAdapter(userAdapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
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;
import java.util.List;
public class MainActivity extends AppCompatActivity {
Button btnSave;
EditText edtName;
DatabaseReference databaseReference;
ListView listViewUsers;
List<User> users;
public static String userId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
users = new ArrayList<User>();
databaseReference = FirebaseDatabase.getInstance().getReference("users");
btnSave = (Button) findViewById(R.id.btnSave);
edtName = (EditText) findViewById(R.id.edtName);
listViewUsers = (ListView) findViewById(R.id.listViewUsers);
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = edtName.getText().toString();
if(TextUtils.isEmpty(userId)) {
//save
String id = databaseReference.push().getKey();
User user = new User(id, name);
databaseReference.child(id).setValue(user);
Toast.makeText(MainActivity.this, "Berhasil buat user", Toast.LENGTH_SHORT).show();
}else {
//update
databaseReference.child(userId).child("name").setValue(name);
Toast.makeText(MainActivity.this, "Berhasil ubah user", Toast.LENGTH_LONG).show();
}
edtName.setText(null);
}
});
}
@Override
protected void onStart() {
super.onStart();
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
users.clear();
for (DataSnapshot postSnapshot: dataSnapshot.getChildren()){
User user = postSnapshot.getValue(User.class);
users.add(user);
}
UserList userAdapter = new UserList(MainActivity.this, users, databaseReference, edtName);
listViewUsers.setAdapter(userAdapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
16.Sekarang Jalankan Program dengan cara pilih menu"Run" > "Run app", Aplikasi bisa diintal pada Android sobar, AVD Manager maupun Emulator android : Genymotion, Nox, Memu, dll.
Tampilan Program Setelah Dijalankan
Proses CRUD pada Aplikasi
Realtime Databse pada Firebase langsung Mengeksekusi secara Instant, kurang dari 5 detik
Dengan Menggunakan Database Firebase ini kita mendapat keuntungan lebih daripada menggunakan database lain yaitu :
- Database dilakukan secara Realtime begitu CRUD dilakukan, langsung memberi efek langsung
- Tidak perlu membuat Tabel karena Firebase ini bersifat Parent & Child (Sifat Menurun)
- Banyak Platform yang bisa digunakan yaitu Android, IOS, maupun web.