Cara Membuat Aplikasi Android

Aplikasi CRUD Android MySql, Menggunakan Retrofit dan Laravel

Aplikasi CRUD Android MySql – Kali ini kita akan membahas bagaimana pembuatan CRUD pada aplikasi berbasis android dengan menggunakan database mysql, kita juga akan memanfaatkan retrofit sebagai rest api client dan laravel sebagai platform web service. Tanpa berbasa-basi lagi, langsung saja kita masuk pada pembahasan bagaimana cara membuat aplikasi crud android menggunakan mysql sebagai database.

BACA JUGA : https://soft-gain.com/2020/06/13/tutorial-laravel-membuat-aplikasi-web-service/

Goals – Mampu membuat operasi CRUD pada aplikasi berbasis android

Diharapkan kita mampu membuat operasi crud pada aplikasi android, dengan memanfaatkan library retrofit dan frame work php yaitu laravel. Untuk metode read data dalam bentuk list sudah pernah dibahas pada artikel ini (https://soft-gain.com/2020/06/23/contoh-sederhana-recyclerview-cardview-dengan-implementasi-retrofit/) dan diharapkan untuk membaca artikel sebelumnya yang membahas pembuatan list data karena artikel ini merupakan kelanjutannya, kali ini kita akan melanjutkan pembuatan pada bagian create, update dan delete data. Contoh hasil aplikasi yang akan kita buat kurang lebih seperti ini :

Aplikasi CRUD Android MySql
Contoh List Data
Aplikasi CRUD Android MySql
Contoh Form Data
Aplikasi CRUD Android MySql
Contoh Hapus Data

Materi

Pertama-tama kita akan menambahkan end point api kita pada file Interface.java, buka file tersebut dan tambahkan code dibawah ini :

@FormUrlEncoded
@PUT("barang/store")
Call<GetReponseSuccess> postBarangStore(@Header("Authorization") String Authorization,
                                            @Field("nama_barang") String nama_barang,
                                            @Field("jumlah_barang") String jumlah_barang,
                                            @Field("keterangan") String keterangan);

@POST("barang/edit/{id}")
Call<SingleDataBarang> postBarangEdit(@Header("Authorization") String Authorization,
                                          @Path(value = "id", encoded = true) String id);

@FormUrlEncoded
@POST("barang/update/{id}")
Call<GetReponseSuccess> postBarangUpdate(@Header("Authorization") String Authorization,
                                            @Field("nama_barang") String nama_barang,
                                            @Field("jumlah_barang") String jumlah_barang,
                                            @Field("keterangan") String keterangan,
                                             @Path(value = "id", encoded = true) String id);

@DELETE("barang/delete/{id}")
Call<GetReponseSuccess> postBarangDelete(@Header("Authorization") String Authorization,
                                             @Path(value = "id", encoded = true) String id);

Sedikit penjelasan, kita menambahkan beberapa end point dengan metode request yang berbeda-beda, kita mendeklarasikan suatu metode pada end point dengan menggunakan annotation @ (contoh @PUT, berarti kita menggunakan metode PUT untuk end point yang satu ini). Berikutnya didalam end point kita juga men-deklarasi-kan ke-url mana end point ini kita tujukan (contoh barang/store, berarti yang akan kita hit adalah end point http://root/barang/store, dimana http://root kita definisikan dari file Client.java). Next, setelahnya kita memanggil model yang akan menjadi re-presentasi response yang akan diterima oleh aplikasi kita (contoh Call<GetResponseSuccess>, didalam class GetResponseSuccess telah terisi attribute, object dan serialisasi data yang sesuai dengan response yang kita terima). Barulah kita membuat suatu interface baru yang didalamnya bisa kita sisipkan parameter-parameter yang hendak kita sertakan saat end point api kita hit (contoh postBarangDelete adalah nama service atau interface dan didalamnya kita sertakan attribute parameter seperti @Header, @Path, @Field dan lain-lain).

Berikutnya buatlah 3 class baru dalam model, class GetReponseSuccess, class SingleDataSuccess dan class SingleDataBarang. Untuk struktur penempatan modelnya boleh disamakan seperti ini :

Aplikasi CRUD Android MySql
Struktur Model

Class GetReponseSuccess akan digunakan berkali-kali untuk men-handle response standar ketika kita sukses melakukan operasi PUT, POST dan DELETE. Isi class-nya kurang lebih seperti ini :

package com.soft_gain.myinventory.Model;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class GetReponseSuccess {
    @SerializedName("success")
    @Expose
    private Boolean success;

    public Boolean getSuccess() {
        return success;
    }

    public void setSuccess(Boolean success) {
        this.success = success;
    }
}

Untuk class SingleDataBarang akan berisi object dari class SingleDataSuccess, dimana isi dari class SingleDataSuccess adalah attribute yang sudah di serialisasi dari class Datum.java (hal ini dilakukan karena response yang kita terima saat hendak melakukan edit data memiliki struktur object didalam object, sehingga mengharuskan kita untuk membuat beberapa model agar kita dapat men-serialisasi-kan object yang hendak kita pakai). Isi dari class SingleDataBarang dan class
SingleDataSuccess masing-masing seperti ini :

package com.soft_gain.myinventory.Model.Barang;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class SingleDataSuccess {
    @SerializedName("data")
    @Expose
    private Datum data;

    public Datum getData() {
        return data;
    }

    public void setData(Datum data) {
        this.data = data;
    }
}
package com.soft_gain.myinventory.Model.Barang;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class SingleDataBarang {
    @SerializedName("success")
    @Expose
    private SingleDataSuccess success;

    public SingleDataSuccess getSuccess() {
        return success;
    }

    public void SingleDataSuccess(SingleDataSuccess success) {
        this.success = success;
    }
}

Create atau Insert Data

Pertama buatlah sebuah layout baru, layout ini akan kita jadikan sebagai top menu yang berisi button “tambah data” saat kita membuka list view, silahkan beri nama top_menu_fragment_list.xml, isinya kurang lebih seperti ini :

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_logout"
        android:title="Logout"
        android:visible="true"
        android:showAsAction="never" />

    <item
        android:id="@+id/action_add"
        android:icon="@drawable/ic_add"
        app:showAsAction="ifRoom"
        android:title="Add"
        android:tint="#fbfff6">
    </item>
</menu>

Untuk asset @drawable/ic_add sendiri, silahkan klik kanan pada bagian drawable dan ikuti petunjuk dibawah ini :

Menambahkan Image Android Studio
Contoh Add Image Drawable 1.1

Lalu isikan seperti dibawah ini (silahkan sesuaikan nama dan gambar yang hendak dipakai sebagai asset) :

Menambahkan Image Android Studio
Contoh Add Image Drawable 1.2

Berikutnya kita akan modifikasi sedikit class MainActivity, ubah pada metode onOptionsItemSelected menjadi seperti dibawah ini :

public boolean onOptionsItemSelected(MenuItem item) {
        Fragment fragment = null;
        int id = item.getItemId();

        if (id == R.id.action_logout) {
            logout();
            return true;
        }else if (id == R.id.action_add) {
            fragment = new BarangFragmentFormAdd();

            if (fragment != null) {
                FragmentManager fragmentManager = getSupportFragmentManager();
                fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
            } else {
                /*Log.e("log softgain : ", "Error in creating fragment");*/
            }
            return true;
        }

        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }

        return super.onOptionsItemSelected(item);
}

Yang perlu diperhatikan diatas adalah penambahan statement else if (id == R.id.action_add), dimana id action_add adalah id pada layout yang sudah kita tambahkan sebelumnya, dan jika statement terpenuhi atau sama dengan true maka kita akan menjalankan sebuah fragment baru (ada pada baris ini new BarangFragmentFormAdd()), yang mana fragment inilah yang memiliki fungsi untuk menampilkan form tambah data.

Berikutnya kita akan menambahkan sebuah class baru BarangFragmentFormAdd, didalam class ini kita akan mendefinisikan metode penyimpanan data kedalam database. Isi class BarangFragmentFormAdd seperti ini :

package com.soft_gain.myinventory.Barang;

import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.soft_gain.myinventory.Api.Client;
import com.soft_gain.myinventory.Api.Interface;
import com.soft_gain.myinventory.Model.GetReponseSuccess;
import com.soft_gain.myinventory.R;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class BarangFragmentFormAdd extends Fragment {
    ProgressDialog progressDoalog;
    SharedPreferences myPrefs;
    EditText nama_barang,jumlah_barang,keterangan;

    public BarangFragmentFormAdd() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_barang_form, container, false);

        nama_barang = (EditText)rootView.findViewById(R.id.nama_barang);
        jumlah_barang = (EditText)rootView.findViewById(R.id.jumlah_barang);
        keterangan = (EditText)rootView.findViewById(R.id.keterangan);

        Button button = (Button) rootView.findViewById(R.id.submit);
        button.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                progressDoalog = new ProgressDialog(getActivity());
                progressDoalog.setMessage("Loading....");
                progressDoalog.show();

                myPrefs = getActivity().getSharedPreferences("sg_shared_pref", getActivity().MODE_PRIVATE);
                String token = myPrefs.getString("token", "");

                Interface service = Client.getClient().create(Interface.class);
                Call<GetReponseSuccess> call = service.postBarangStore("Bearer "+token, nama_barang.getText().toString(), jumlah_barang.getText().toString(), keterangan.getText().toString());
                call.enqueue(new Callback<GetReponseSuccess>() {
                    @Override
                    public void onResponse(Call<GetReponseSuccess> call, Response<GetReponseSuccess> response) {
                        if(response.isSuccessful()){
                            progressDoalog.dismiss();
                            Toast.makeText(getActivity(), "Submit data berhasil!", Toast.LENGTH_SHORT).show();

                            BarangFragmentList nextFrag= new BarangFragmentList();
                            getActivity().getSupportFragmentManager().beginTransaction()
                                    .replace(R.id.content_frame, nextFrag, "findThisFragment")
                                    .addToBackStack(null)
                                    .commit();
                        }else{
                            /*Log.v("log softgain : ", String.valueOf(response.errorBody()));*/
                            progressDoalog.dismiss();
                            Toast.makeText(getActivity() ,"Submit data gagal!",Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onFailure(Call<GetReponseSuccess> call, Throwable t) {
                        /*Log.v("log softgain : ", String.valueOf(t));*/
                        progressDoalog.dismiss();
                        Toast.makeText(getActivity(), "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

        return rootView;
    }
}

Yang perlu dipahami adalah, pada metode onClick kita telah menjalankan end point api yang sudah kita buat sebelumnya yaitu postBarangStore, berikut juga kita definisikan semua parameter yang diperlukan oleh end point api tersebut (pada bagian ini Call<GetReponseSuccess> call = service.postBarangStore(“Bearer “+token, nama_barang.getText().toString(), jumlah_barang.getText().toString(), keterangan.getText().toString());), perlu diingat untuk urutan parameter yang hendak kita kirim jangan sampai salah karena akan mempengaruhi proses yang terjadi disisi server. Lalu jika proses simpan data berhasil (statement ini response.isSuccessful()), tampilan akan kita kembalikan pada bagian list data (ada pada bagian ini new BarangFragmentList()).

Berikutnya kita akan buat sebuah layout baru dengan nama fragment_barang_form.xml, layout inilah yang akan menjadi interface dari form yang akan kita gunakan. Isi dari file fragment_barang_form seperti ini :

<?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" tools:context = ".LoginActivity">

    <TextView
        android:text = "Form Barang"
        android:layout_width="wrap_content"
        android:layout_height = "wrap_content"
        android:id = "@+id/textview"
        android:textSize = "35dp"
        android:layout_alignParentTop = "true"
        android:layout_centerHorizontal = "true" />

    <TextView
        android:text = "Nama Barang"
        android:layout_width="wrap_content"
        android:layout_height = "wrap_content"
        android:id = "@+id/lable_nama_barang"
        android:textSize = "14dp"
        android:layout_below="@+id/textview"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="15dp" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:background="@drawable/rounded_edittext"
        android:layout_below="@+id/lable_nama_barang"
        android:layout_margin="10dp"
        android:layout_marginTop="10dp"
        android:hint="Isi Disini"
        android:textColorHint="@color/cardview_shadow_start_color"
        android:id = "@+id/nama_barang"
        android:layout_centerHorizontal = "true" />

    <TextView
        android:text = "Jumlah Barang"
        android:layout_width="wrap_content"
        android:layout_height = "wrap_content"
        android:id = "@+id/lable_jumlah_barang"
        android:textSize = "14dp"
        android:layout_below="@+id/nama_barang"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="15dp"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:background="@drawable/rounded_edittext"
        android:layout_below="@+id/lable_jumlah_barang"
        android:layout_margin="10dp"
        android:layout_marginTop="10dp"
        android:hint="Isi Disini"
        android:textColorHint="@color/cardview_shadow_start_color"
        android:id = "@+id/jumlah_barang"
        android:inputType = "number" />

    <TextView
        android:text = "Keterangan"
        android:layout_width="wrap_content"
        android:layout_height = "wrap_content"
        android:id = "@+id/lable_keterangan"
        android:textSize = "14dp"
        android:layout_below="@+id/jumlah_barang"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="15dp"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:padding="10dip"
        android:background="@drawable/rounded_edittext"
        android:layout_below="@+id/lable_keterangan"
        android:layout_margin="10dp"
        android:layout_marginTop="10dp"
        android:hint="Isi Disini"
        android:textColorHint="@color/cardview_shadow_start_color"
        android:id = "@+id/keterangan"
        android:inputType = "text|textMultiLine" />

    <Button
        android:id="@+id/submit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/keterangan"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:background="@android:color/holo_red_dark"
        android:text="Submit"
        android:textColor="@android:color/white" />

</RelativeLayout>

Terakhir tambahkan sebuah file pada drawable asset dengan nama rounded_edittext.xml yang akan kita gunakan sebagai design template dari editText yang kita gunakan pada form isi-an. Isi dari file rounded_edittext seperti ini :

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" android:padding="10dp">
    <solid android:color="#fff"/>
    <stroke android:width="1dip" android:color="@color/cardview_shadow_start_color" />
    <corners
        android:bottomRightRadius="15dp"
        android:bottomLeftRadius="15dp"
        android:topLeftRadius="15dp"
        android:topRightRadius="15dp" />
</shape>

Read data

Pada tampilan list data, terdapat dua buah button berbentuk pensil dan tempat sampah, ketika user men-klik button pensil kita hendak memanggil single data dan kita tampilkan pada form agar user dapat melakukan perubahan pada data tersebut.

Pertama kita akan melakukan sedikit modifikasi pada class BarangAdapter, kita akan melakukan perubahan pada metode onBindViewHolder. Silahkan ubah bagian onBindViewHolder menjadi seperti dibawah ini :

public void onBindViewHolder(CustomViewHolder holder, int position) { 
       holder.txtTitle.setText(dataList.get(position).getNamaBarang());
        final String idData = String.valueOf(dataList.get(position).getId());
        final String titleData = String.valueOf(dataList.get(position).getNamaBarang());

        holder.edit.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                /*Log.v("log softgain : ", String.valueOf(idData));*/
                SharedPreferences sgSharedPref = context.getSharedPreferences("sg_shared_pref", context.MODE_PRIVATE);
                SharedPreferences.Editor editor = sgSharedPref.edit();
                editor.putString("editedIdBarang", idData);
                editor.apply();

                BarangFragmentFormEdit nextFrag= new BarangFragmentFormEdit();
                ((MainActivity)context).getSupportFragmentManager().beginTransaction()
                        .replace(R.id.content_frame, nextFrag, "findThisFragment")
                        .addToBackStack(null)
                        .commit();
            }
        });

        holder.delete.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                try{
                    showDialog(String.valueOf(titleData), String.valueOf(idData));
                } catch (Exception e){
                    e.printStackTrace();
                }
                /*Log.v("log softgain : ", String.valueOf(idData));*/
            }
        });
}

Kita akan memberikan event on click pada button edit yang kita definisi-kan sebagai holder.edit, didalamnya kita akan menyimpan id yang akan menjadi acuan data mana yang akan diubah (kita definisi-kan sebagai idData). Id tadi akan kita simpan ke dalam shared preferences (dibagian ini editor.putString(“editedIdBarang”, idData)), lalu kita akan membuka sebuah fragment baru yaitu BarangFragmentFormEdit (anyway, jika pembaca ada yang memiliki metode pemindahan id dari satu fragment ke fragment lainnya dengan cara yang lebih efisien silahkan disampaikan pada kolom komentar).

Lalu kita akan membuat sebuah class baru dengan nama BarangFragmentFormEdit, isi dari class BarangFragmentFormEdit kurang lebih seperti ini :

package com.soft_gain.myinventory.Barang;

import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.soft_gain.myinventory.Api.Client;
import com.soft_gain.myinventory.Api.Interface;
import com.soft_gain.myinventory.Model.Barang.SingleDataBarang;
import com.soft_gain.myinventory.Model.GetReponseSuccess;
import com.soft_gain.myinventory.R;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class BarangFragmentFormEdit extends Fragment {
    ProgressDialog progressDoalog;
    SharedPreferences myPrefs;
    EditText nama_barang,jumlah_barang,keterangan;

    public BarangFragmentFormEdit() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_barang_form, container, false);

        nama_barang = (EditText)rootView.findViewById(R.id.nama_barang);
        jumlah_barang = (EditText)rootView.findViewById(R.id.jumlah_barang);
        keterangan = (EditText)rootView.findViewById(R.id.keterangan);

        progressDoalog = new ProgressDialog(getActivity());
        progressDoalog.setMessage("Loading....");
        progressDoalog.show();

        myPrefs = getActivity().getSharedPreferences("sg_shared_pref", getActivity().MODE_PRIVATE);
        final String token = myPrefs.getString("token", "");
        final String editedIdBarang = myPrefs.getString("editedIdBarang", "");

        Interface service = Client.getClient().create(Interface.class);
        Call<SingleDataBarang> call = service.postBarangEdit("Bearer "+token, editedIdBarang);
        call.enqueue(new Callback<SingleDataBarang>() {
            @Override
            public void onResponse(Call<SingleDataBarang> call, Response<SingleDataBarang> response) {
                if(response.isSuccessful()){
                    progressDoalog.dismiss();
                    /*Log.v("log softgain : ", String.valueOf(response.body().getSuccess().getData().getNamaBarang()));*/
                    nama_barang.setText(String.valueOf(response.body().getSuccess().getData().getNamaBarang()));
                    jumlah_barang.setText(String.valueOf(response.body().getSuccess().getData().getJumlahBarang()));
                    keterangan.setText(String.valueOf(response.body().getSuccess().getData().getKeterangan()));
                }else{
                    /*Log.v("log softgain : ", String.valueOf(response.errorBody()));*/
                    progressDoalog.dismiss();
                    Toast.makeText(getActivity() ,"Ambil data gagal!",Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<SingleDataBarang> call, Throwable t) {
                /*Log.v("log softgain : ", String.valueOf(t));*/
                progressDoalog.dismiss();
                Toast.makeText(getActivity(), "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
            }
        });

        Button button = (Button) rootView.findViewById(R.id.submit);
        button.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                progressDoalog = new ProgressDialog(getActivity());
                progressDoalog.setMessage("Loading....");
                progressDoalog.show();

                Interface service = Client.getClient().create(Interface.class);
                Call<GetReponseSuccess> call = service.postBarangUpdate("Bearer "+token, nama_barang.getText().toString(), jumlah_barang.getText().toString(), keterangan.getText().toString(), editedIdBarang);
                call.enqueue(new Callback<GetReponseSuccess>() {
                    @Override
                    public void onResponse(Call<GetReponseSuccess> call, Response<GetReponseSuccess> response) {
                        if(response.isSuccessful()){
                            progressDoalog.dismiss();
                            Toast.makeText(getActivity(), "Submit data berhasil!", Toast.LENGTH_SHORT).show();

                            BarangFragmentList nextFrag= new BarangFragmentList();
                            getActivity().getSupportFragmentManager().beginTransaction()
                                    .replace(R.id.content_frame, nextFrag, "findThisFragment")
                                    .addToBackStack(null)
                                    .commit();
                        }else{
                            /*Log.v("log softgain : ", String.valueOf(response.errorBody()));*/
                            progressDoalog.dismiss();
                            Toast.makeText(getActivity() ,"Submit data gagal!",Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onFailure(Call<GetReponseSuccess> call, Throwable t) {
                        /*Log.v("log softgain : ", String.valueOf(t));*/
                        progressDoalog.dismiss();
                        Toast.makeText(getActivity(), "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

        return rootView;
    }
}

Untuk proses pembacaan data, kita akan fokus pada metode onCreateView dibagian Call<SingleDataBarang> call = service.postBarangEdit(“Bearer “+token, editedIdBarang), dibagian ini kita akan menggunakan end point api kita untuk memanggil data yang hendak kita modifikasi. Jika berhasil, maka data yang kita terima akan kita masukan pada editText untuk ditampilkan pada user :

nama_barang.setText(String.valueOf(response.body().getSuccess().getData().getNamaBarang()));
jumlah_barang.setText(String.valueOf(response.body().getSuccess().getData().getJumlahBarang()));
keterangan.setText(String.valueOf(response.body().getSuccess().getData().getKeterangan()));

Dan kita masih akan menggunakan layout fragment_barang_form sebagai interface form isi-an.

Update data

Untuk proses update data, kita masih akan melakukannya pada class BarangFragmentFormEdit, untuk update data itu sendiri kita akan melakukannya pada on click event dari button dengan id submit. Untuk detailnya ada pada bagian ini :

Interface service = Client.getClient().create(Interface.class);
                Call<GetReponseSuccess> call = service.postBarangUpdate("Bearer "+token, nama_barang.getText().toString(), jumlah_barang.getText().toString(), keterangan.getText().toString(), editedIdBarang);
                call.enqueue(new Callback<GetReponseSuccess>() {
                    @Override
                    public void onResponse(Call<GetReponseSuccess> call, Response<GetReponseSuccess> response) {
                        if(response.isSuccessful()){
                            progressDoalog.dismiss();
                            Toast.makeText(getActivity(), "Submit data berhasil!", Toast.LENGTH_SHORT).show();

                            BarangFragmentList nextFrag= new BarangFragmentList();
                            getActivity().getSupportFragmentManager().beginTransaction()
                                    .replace(R.id.content_frame, nextFrag, "findThisFragment")
                                    .addToBackStack(null)
                                    .commit();
                        }else{
                            /*Log.v("log softgain : ", String.valueOf(response.errorBody()));*/
                            progressDoalog.dismiss();
                            Toast.makeText(getActivity() ,"Submit data gagal!",Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onFailure(Call<GetReponseSuccess> call, Throwable t) {
                        /*Log.v("log softgain : ", String.valueOf(t));*/
                        progressDoalog.dismiss();
                        Toast.makeText(getActivity(), "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
                    }
});

Pada bagian ini hampir mirip dengan fungsi untuk menyimpan data, hanya saja kali ini end point api yang kita hit adalah postBarangUpdate.

Delete data

Untuk proses hapus data, kita akan kembali ke class BarangAdapter. Jika untuk edit data kita menggunakan holder.edit, maka untuk hapus data kita akan gunakan holder.delete :

holder.delete.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                try{
                    showDialog(String.valueOf(titleData), String.valueOf(idData));
                } catch (Exception e){
                    e.printStackTrace();
                }
                /*Log.v("log softgain : ", String.valueOf(idData));*/
            }
});

Didalamnya, kita akan memanggil metode baru yaitu showDialog, metode ini adalah metode sederhana untuk memunculkan popup dialog yes/no yang akan kita manfaatkan untuk men-konfirmasi user jika hendak men-hapus data. Detail metode-nya seperti ini :

public void showDialog(final String title, final String id) throws Exception {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);

        builder.setMessage("Hapus : " + title + "?");

        builder.setPositiveButton("Ya", new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which){
                dialog.dismiss();

                progressDoalog = new ProgressDialog(context);
                progressDoalog.setMessage("Loading....");
                progressDoalog.show();

                myPrefs = context.getSharedPreferences("sg_shared_pref", context.MODE_PRIVATE);
                String token = myPrefs.getString("token", "");

                Interface service = Client.getClient().create(Interface.class);
                Call<GetReponseSuccess> call = service.postBarangDelete("Bearer "+token, id);
                call.enqueue(new Callback<GetReponseSuccess>() {
                    @Override
                    public void onResponse(Call<GetReponseSuccess> call, Response<GetReponseSuccess> response) {
                        if(response.isSuccessful()){
                            progressDoalog.dismiss();
                            Toast.makeText(context, "Hapus data berhasil!", Toast.LENGTH_SHORT).show();

                            BarangFragmentList nextFrag= new BarangFragmentList();
                            ((MainActivity)context).getSupportFragmentManager().beginTransaction()
                                    .replace(R.id.content_frame, nextFrag, "findThisFragment")
                                    .addToBackStack(null)
                                    .commit();
                        }else{
                            /*Log.v("log softgain : ", String.valueOf(response.errorBody()));*/
                            progressDoalog.dismiss();
                            Toast.makeText(context ,"Hapus data gagal!",Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onFailure(Call<GetReponseSuccess> call, Throwable t) {
                        /*Log.v("log softgain : ", String.valueOf(t));*/
                        progressDoalog.dismiss();
                        Toast.makeText(context, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

        builder.setNegativeButton("Tidak", new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which){
                dialog.dismiss();
            }
        });
        builder.show();
}

Jika user memilih yes, maka kita akan menjalankan end point api postBarangDelete agar data yang dimaksud dapat dihapus dari database.

Penutup

Demikian lah proses pembuatan CRUD pada aplikasi berbasis android menggunakan mysql sebagai database, retrofit sebagai rest api client dan frame work laravel sebagai platform serb service. Menurut saya pemahaman tentang crud ini sendiri sangatlah penting, karena memang ini adalah dasar dan modal dari semua aplikasi yang akan kita buat di-kemudian hari. Semoga bermanfaat dan mohon maaf apabila terdapat kekeliruan penjelasan pada artikel ini, silahkan ambil full source-nya pada repo ini (https://github.com/ImmanuelJL/myinventory.git), terima kasih.

Leave a Reply

Your email address will not be published. Required fields are marked *