Tutorial CRUD Firebase Realtime Database di Android (IV) : Membuat Fungsi Delete Data

Akhirnya kita sampai pada fitur terakhir dalam series tutorial membuat aplikasi CRUD di Firebase Realtime Database menggunakan Android Studio. Seperti namanya, CRUD (Create, Read, Update, dan Delete), aplikasi inventaris kita sejauh ini sudah mempunyai fitur-fitur untuk tambah data, baca data, dan edit data. Tinggal satu fitur terakhir ini yang belum kita implementasikan, yaitu fitur Delete data yang akan dibahas di postingan ini. Karena ini fitur terakhir, maka saya sangat sarankan kalian untuk membaca dan melakukan tutorial-tutorial sebelumnya sebelum lanjut ke coding. Indeks tutorial Firebase Realtime DB bisa kalian baca di sini. Atau merujuk ke link pre-requisites di bawah ini.

Pre-requisites

Implementasi Fitur Delete Data pada Firebase Realtime Database Android

Jika kalian sudah selesai membaca dan melakukan tutorial-tutorial pre-requisites di atas, maka langsung saja. Untuk fitur Delete Data ini konsepnya sama seperti fitur Update Data sebelumnya. Kita akan mengaksesnya melalui activity Read Data, dimana di RecyclerView akan kita tambahkan listener yang akan memunculkan dialog ketika kita melakukan aksi long click di RecyclerView item tersebut.

Bagian tricky nya, karena kita memasang listener long click itu pada adapter yang tidak mempunyai reference ke FirebaseDatabase, maka di sini kita akan menggunakan sebuah interface, yang berfungsi untuk menyambungkan adapter dengan Read Data activity yang mempunyai reference ke FirebaseDatabase, sehingga aksi Delete data bisa dilakukan, dan sekaligus update view di Read Data activity.

Buka file AdapterBarangRecyclerView.java dan tambahkan interface berikut di bagian paling bawah source code, sebelum tanda “}” terakhir :

    public interface FirebaseDataListener{
        void onDeleteData(Barang barang, int position);
    }

Kemudian masih di kelas AdapterBarangRecyclerView.java, tambahkan variabel untuk FirebaseDataListener, dan juga tambahkan kode untuk inisialisasi variabel tersebut pada constructor, kodenya seperti di bawah ini :

    FirebaseDataListener listener;

    // rest of code...
 
    public AdapterBarangRecyclerView(ArrayList<Barang> barangs, Context ctx){
        /** 
         * Inisiasi data dan variabel yang akan digunakan
         */
        daftarBarang = barangs;
        context = ctx;
        listener = (FirebaseDBReadActivity)ctx;
    }

Masih di kelas adapter yang sama, pada bagian onBindViewHolder() tambahkan kode seperti di bawah ini yang berfungsi untuk melakukan pemanggilan interface saat tombol delete diklik, dan fungsi onDeleteData() akan dijalankan.

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    /**
     *  Menampilkan data pada view
     */
    final String name = daftarBarang.get(position).getNama();
 
    holder.tvTitle.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            /**
             *  Kodingan untuk tutorial Selanjutnya :p Read detail data
             */
        }
    });
 
    holder.tvTitle.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            /**
             *  Kodingan untuk delete dan update data
             */
            final Dialog dialog = new Dialog(context);
            dialog.setContentView(R.layout.dialog_view);
            dialog.setTitle("Pilih Aksi");
            dialog.show();
 
            Button editButton = (Button) dialog.findViewById(R.id.bt_edit_data);
            Button delButton = (Button) dialog.findViewById(R.id.bt_delete_data);
 
            //apabila tombol edit diklik
            editButton.setOnClickListener(
                    new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            dialog.dismiss();
                            context.startActivity(FirebaseDBCreateActivity.getActIntent((Activity) context).putExtra("data", daftarBarang.get(position)));
                        }
                    }
            );
 
            //apabila tombol delete diklik
            delButton.setOnClickListener(
                    new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            /**
                             *  Kodingan untuk Delete data (memanggil interface delete data)
                             */
                            dialog.dismiss();
                            listener.onDeleteData(daftarBarang.get(position), position);
                        }
                    }
            );
            return true;
        }
    });
    holder.tvTitle.setText(name);
}

Selanjutnya, buka file activity Read Data (FirebaseDBReadActivity.java), di sana kita buat kelas nya mengimplement interface FirebaseDataListener yang kita buat di atas. Dan kemudian kita override method onDeleteData() dari interface tersebut. Di situlah kita akan melakukan operasi delete data. Kode lengkapnya seperti di bawah ini :

FirebaseDBReadActivity.java

package id.web.twoh.twohfirebase;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnSuccessListener;
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 id.web.twoh.twohfirebase.adapter.AdapterBarangRecyclerView;
import id.web.twoh.twohfirebase.model.Barang;

/**
 * Created by Herdi_WORK on 18.06.17.
 */

public class FirebaseDBReadActivity extends AppCompatActivity implements AdapterBarangRecyclerView.FirebaseDataListener {

    /**
     * Mendefinisikan variable yang akan dipakai
     */
    private DatabaseReference database;
    private RecyclerView rvView;
    private RecyclerView.Adapter adapter;
    private RecyclerView.LayoutManager layoutManager;
    private ArrayList<Barang> daftarBarang;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /**
         * Mengeset layout
         */
        setContentView(R.layout.activity_db_read);

        /**
         * Inisialisasi RecyclerView & komponennya
         */
        rvView = (RecyclerView) findViewById(R.id.rv_main);
        rvView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this);
        rvView.setLayoutManager(layoutManager);

        /**
         * Inisialisasi dan mengambil Firebase Database Reference
         */
        database = FirebaseDatabase.getInstance().getReference();

        /**
         * Mengambil data barang dari Firebase Realtime DB
         */
        database.child("barang").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                /**
                 * Saat ada data baru, masukkan datanya ke ArrayList
                 */
                daftarBarang = new ArrayList<>();
                for (DataSnapshot noteDataSnapshot : dataSnapshot.getChildren()) {
                    /**
                     * Mapping data pada DataSnapshot ke dalam object Barang
                     * Dan juga menyimpan primary key pada object Barang
                     * untuk keperluan Edit dan Delete data
                     */
                    Barang barang = noteDataSnapshot.getValue(Barang.class);
                    barang.setKey(noteDataSnapshot.getKey());

                    /**
                     * Menambahkan object Barang yang sudah dimapping
                     * ke dalam ArrayList
                     */
                    daftarBarang.add(barang);
                }

                /**
                 * Inisialisasi adapter dan data barang dalam bentuk ArrayList
                 * dan mengeset Adapter ke dalam RecyclerView
                 */
                adapter = new AdapterBarangRecyclerView(daftarBarang, FirebaseDBReadActivity.this);
                rvView.setAdapter(adapter);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                /**
                 * Kode ini akan dipanggil ketika ada error dan
                 * pengambilan data gagal dan memprint error nya
                 * ke LogCat
                 */
                System.out.println(databaseError.getDetails()+" "+databaseError.getMessage());
            }
        });
    }

    public static Intent getActIntent(Activity activity){
        return new Intent(activity, FirebaseDBReadActivity.class);
    }

    @Override
    public void onDeleteData(Barang barang, final int position) {
        /**
         * Kode ini akan dipanggil ketika method onDeleteData 
         * dipanggil dari adapter lewat interface.
         * Yang kemudian akan mendelete data di Firebase Realtime DB
         * berdasarkan key barang.
         * Jika sukses akan memunculkan Toast
         */        
        if(database!=null){            database.child("barang").child(barang.getKey()).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Toast.makeText(FirebaseDBReadActivity.this,"success delete", Toast.LENGTH_LONG).show();
                }
            });

        }
    }
}

Penjelasannya bisa kalian baca pada komentar di source code di atas, namun intinya sama seperti Update Data. Aplikasi akan menggunakan key barang sebagai ID / penanda barang mana yang akan didelete. Jika pada database ada barang dengan key yang sama, maka aplikasi akan memanggil fungsi removeValue() pada Firebase Realtime DB. Dan menghapus data tersebut dari Firebase Realtime DB.

Setelah data terhapus, maka aplikasi akan secara otomatis melakukan update view, sehingga data yang dihapus itu tidak lagi muncul di list RecyclerView.

Oh iya. Pada tutorial ini, di beberapa bagian saya sengaja tidak mencantumkan source codenya secara full, namun jangan khawatir karena kalian bisa melihat dan mendownload full source code-nya di GitHub saya.:)

Jika sudah, mari kita langsung saja demokan aplikasinya. 🙂

Demo

Buka aplikasinya, dan kemudian langsung masuk ke menu Lihat Data. Contoh di bawah sudah ada beberapa data di Firebase Realtime Data, jika belum ada data, bisa Tambah Data terlebih dahulu.

Kemudian pilih data yang ingin dihapus, contoh kita akan menghapus data “sepeda motor”, maka ketika kita lakukan long click akan muncul dialog seperti di bawah. Klik > “Delete”. Dan data “sepeda motor” pun akan langsung terhapus dari database Firebase, seperti flow di bawah :

Flow Delete Data Firebase Realtime DB

Flow Delete Data Firebase Realtime DB

Conclusion

Postingan ini adalah bagian keempat dari fitur CRUD(Create, Read, Update, Delete) yang kita implementasikan pada Firebase Realtime Database. Fitur Delete Data ini memang fitur terakhir yang kita tambahkan, namun apakah ini tutorial terakhir di seri CRUD pada Firebase Realtime Database? Tentu saja tidak, ada bonus satu tutorial lagi yaitu tentang Read Detail Data. Bagaimana cara menampilkan data lebih detail, setelah kita mengklik sebuah item pada daftar data di aplikasi inventaris yang kita buat.😀

Semoga berguna, untuk source code-nya, kalian bisa download di GitHub saya. Jangan lupa untuk follow dan star juga ya. 😀

Dan jangan sungkan untuk bertanya apabila ada yang kurang mengerti, silahkan tulis lewat komentar di bawah. 😉

 





Download aplikasi kami di Google Play Store


Leave a Reply