Lorem ipsum dolor sit amet, consectetur adipiscing elit. Test link

CRUD Database MySQL dengan PHP Pada Android Studio



Teori Singkat

Definisi CRUD

CRUD adalah singkatan dari create, read, update, and delete. Keempat poin ini menurut Techopedia merupakan fungsi-fungsi utama yang diimplementasikan dalam aplikasi database. Akronim CRUD mengidentifikasi semua fungsi utama yang melekat pada database relasional dan aplikasi yang digunakan untuk mengelolanya, termasuk Oracle Database, Microsoft SQL Server, MySQL, dan lainnya.

CRUD adalah operasi pemograman yang menawarkan fungsi penuh, Dalam memahami pemograman komputer, CRUD merupakan fungsi yang esensial untuk dipahami. kamu perlu memahami arti dari semua fungsi yang diimplementasikan dari database atau aplikasi, tidak hanya arti dari sebagian fungsi saja. Fungsi create, read, update, dan delete merupakan fungsi yang secara konstan digunakan dan merupakan bagian yang tidak terpisahkan dari pekerjaan seorang programmer. Ini karena hampir sebagian besar pemograman komputer modern menggunakan fungsi CRUD.




Create

Fungsi CRUD yang pertama adalah create. Fungsi ini memungkinkanmu membuat record baru dalam database. Dalam aplikasi SQL, fungsi create sering disebut juga sebagai insert. Kamu dapat membuat baris baru dan mengisinya dengan data yang sesuai dengan setiap atribut. Tetapi, hanya administrator yang dapat menambahkan atribut baru ke tabel itu sendiri.

Read
Fungsi read hampir mirip dengan fungsi search. Fungsi ini memungkinkan kamu untuk mencari dan mengambil data tertentu dalam tabel dan membaca nilainya. Kamu dapat menemukan record yang diinginkan menggunakan kata kunci,atau dengan memfilter data berdasarkan kriteria yang diinginkan.

Update
Untuk memodifikasi record yang telah tersimpan di database, fungsi CRUD yang bisa kamu gunakan adalah fungsi update. Namun, kamu perlu mengubah berbagai informasi terkait agar bisa memodifikasi record yang diinginkan secara utuh. Record yang ada dalam database harus diubah dan semua nilai atribut diubah untuk mencerminkan karakteristik baru yang diinginkan.

Delete
Ketika ada record atau data yang tidak lagi dibutuhkan dalam database, fungsi CRUD yang digunakan adalah fungsi delete. Fungsi ini dapat digunakan untuk menghapus data tersebut. Beberapa aplikasi database relasional mungkin mengizinkan kamu untuk melakukan hard delete atau soft delete. Hard delete akan secara menghapus catatan dari database permanen. Sementara, soft delete hanya akan memperbarui status baris untuk menunjukkan bahwa data telah dihapus meskipun data tersebut tetap ada dan utuh

PHP dan MySQL

HP and MySQL merupakan kolaborasi antara bahasa pemrograman dan layanan database yang populer saat ini. Jumlah situs yang menggunakan PHP mencapai 78.9% (The Web Technology Surveys, 2019). PHP adalah bahasa pemrograman script server-side yang didesain untuk pengembangan web. Selain itu, PHP juga bisa digunakan sebagai bahasa pemrograman umum yang digunakan pada website seperti Wikipedia, WordPress, Facebook dan lain-lain. Penggunaan PHP banyak dipadukan dengan MySQL. MySQL adalah sebuah perangkat lunak system manajemen basis data SQL (DBMS) yang multithread, dan multi-user.



MySQL ditetapkan sebagai RDBMS terpopuler kedua per Juli 2019 setelah Oracle (DB-Engines, 2019). Keduanya dapat digunakan secara gratis, dirilis dengan lisensi open source, dan memiliki komunitas pengguna yang besar. Kelebihan-kelebihan tersebut menjadikan PHP dan MySQL sebagai salah satu pilihan teknologi yang digunakan untuk membuat website. Developer harus memiliki kompetensi yang memadahi untuk dapat memanfaatkan PHP dan MySQL. Untuk PHP diperlukan pemahaman sintaks, variabel, tipe data, metode pembuatan form, struktur kontrol, konsep cookies, konsep session, metode pembuatan fungsi, metode pengelolaan file, dan manajemen direktori. Untuk MySQL, developer harus memahami dasar-dasar Structure Query Language (SQL). SQL merupakan bahasa standar untuk menyimpan, mengubah, dan mengambil data pada database.

Web Services

Web service merupakan aplikasi yang berisi sekumpulan basis data (database) dan perangkat lunak (software) atau bagian dari program perangkat lunak yang diakses secara remote oleh piranti dengan perantara tertentu. Melalui web service, memungkinkan pengguna untuk mengatasi permasalahan berupa interoperability dan mengintegrasikan sistem berbeda.

Pada umumnya, web service memiliki ciri khusus berupa URL layaknya web. Yang membuat berbeda adalah interaksi yang diberikan oleh web service itu sendiri. URL pada web service hanya mengandung sekumpulan informasi, perintah, dan konfigurasi (sintaks yang berguna untuk membangun fungsi tertentu dari aplikasi). untuk ilustrasi gambaran dari Web Servis bisa anda lihat pada gambar di bawah ini



Web service mampu menukar data tanpa memandang sumber database, bahasa yang digunakan, dan pada platform apa data tersebut dikonsumsi. Kemampuan itulah yang memungkinkan web service menjadi jembatan penghubung untuk berbagai sistem.

Praktikum

Membuat Project Baru di Android Studio

  • Pertama jalankan aplikasi IDE Android Studio, caranya :
    a. Pilih Start >> Android Studio
    b. Pilih >> Start a new Android Studio Project
    c. Pilih >> Empty Activity >> Next
  • Name >> CRUD_PHPMySQL
  • Package Name >> ubah menjadi nama blog kalian masing-masing, di sini saya menggunakan url blog saya naskahkode.com lalu di ikuti nama project CRUD_PHPMySQL
  • Save Location >> \home\zall\AndroidStudioProjects\CRUD_PHPMySQL
  • Language >> Java
  • Minimum API Level >> API 15 >> Klik Finish


  • Selanjutnya buat layout linear layout dengan ketikan kode program activity_main.xml seperti di bawah ini.
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    android:paddingBottom="16dp"
    tools:context=".MainActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Nama Mahasiswa :"
        android:textSize="18dp"/>
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextName"
        android:hint="Masukan Nama Anda"
        android:inputType="text" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="N R P :"
        android:textSize="18dp" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextNRP"
        android:hint="Maukan NRP"
        android:inputType="number"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Kelas :"
        android:textSize="18dp" />
    <Spinner
        android:id="@+id/spinnerkelas"
        android:spinnerMode="dropdown"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Blog Url :"
        android:textSize="18dp"/>
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextBlog"
        android:hint="Input Link URL Blog"
        android:inputType="text"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Tambah Data Mahasiswa"
        android:id="@+id/buttonAdd" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Daftar Mahasiswa"
        android:id="@+id/buttonView" />
</LinearLayout>
  • Preview dari kode program di atas tampil seperti berikut :


  • Selanjutnya ketikan kode MainActivity.java sebagai berikut :
package com.naskahkode.crud_phpmysql;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.HashMap;

public   class MainActivity extends AppCompatActivity implements  View.OnClickListener {
    private EditText editTextName;
    private EditText editTextNRP;
    private EditText editTextBlog;
    private Button buttonAdd;
    private Button buttonView;
    private Spinner spinnerKelas;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editTextName = (EditText) findViewById(R.id.editTextName);
        editTextNRP = (EditText) findViewById(R.id.editTextNRP);
        editTextBlog = (EditText) findViewById(R.id.editTextBlog);
        buttonAdd = (Button) findViewById(R.id.buttonAdd);
        buttonView = (Button) findViewById(R.id.buttonView);
        spinnerKelas = (Spinner) findViewById(R.id.spinnerkelas);
        String[] spinnerItem = new String[]{"TI-1","TI-2","TI-3","TI-Mlm"};
        ArrayAdapter<String> adapter = new  ArrayAdapter<>(this, android.R.layout.simple_spinner_item,spinnerItem);
        spinnerKelas.setAdapter(adapter);

        buttonAdd.setOnClickListener(this);
        buttonView.setOnClickListener(this);
    }

    private void addMhs(){
        final String name = editTextName.getText().toString().trim();
        final String nrp = editTextNRP.getText().toString().trim();
        final String blog = editTextBlog.getText().toString().trim();
        final String kelas =(String) spinnerKelas.getSelectedItem();
        Log.d("kelas",kelas);

        class AddMhs extends AsyncTask<Void,Void,String>{
            ProgressDialog loading;
            @Override protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(MainActivity.this,"Menambahkan...","Tunggu...",false,false);
            }
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
            }
            @Override
            protected String doInBackground(Void... v) {
                HashMap<String,String> params = new HashMap<>();
                params.put(konfigurasi.KEY_MHS_NAMA,name);
                params.put(konfigurasi.KEY_MHS_NRP,nrp);
                params.put(konfigurasi.KEY_MHS_KELAS,kelas);
                params.put(konfigurasi.KEY_MHS_BLOG,blog);

                RequestHandler rh = new RequestHandler();
                String res = rh.sendPostRequest(konfigurasi.URL_ADD, params);
                Log.d("res",res);
                return res;
            }
        }
        AddMhs ae = new AddMhs();
        ae.execute();
    }
    @Override
    public void onClick(View v) {
        if(v == buttonAdd){
            addMhs();
        }
        if(v == buttonView){
            startActivity(new Intent(this,TampilSemuaMhs.class));
        }
    }
}

Membuat Layout Untuk Menampilkan Semua Data

Selanjutnya kita akan membuat activity baru yang berisi layout activity_tampil_semua_mhs.xml dan class TampilSemuaMhs Caranya yaitu :

  • Klik kanan pada direktori package name > New > Activity > Empty Activity


  • Isikan kolom Activity Name dengan TampilSemuaMhs> Klik Finish


  • activity_tampil_semua_mhs.xml Layout ini nantinya akan digunakan untuk melihat semua data pegawai yang sudah diinputkan pada layout utama. Silahkan tambahkan kode-kode di bawah pada layout tersebut :
<?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:orientation="vertical"
    android:layout_height="match_parent"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    android:paddingBottom="16dp"
    tools:context=".TampilSemuaMhs">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView" />
</LinearLayout>
  • Untuk kode-kode java pada class TampilSemuaMhs.java coba anda ketikan seperti berikut
package com.naskahkode.crud_phpmysql;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;

public class TampilSemuaMhs extends AppCompatActivity implements ListView.OnItemClickListener{
    private ListView listView;
    private String JSON_STRING;

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tampil_semua_mhs);
        listView = (ListView) findViewById(R.id.listView);
        listView.setOnItemClickListener(this);
        getJSON();
    }

    private void showMhs(){
        JSONObject jsonObject = null;
        ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String, String>>();
        try {
            jsonObject = new JSONObject(JSON_STRING);
            JSONArray result = jsonObject.getJSONArray(konfigurasi.TAG_JSON_ARRAY);
            for(int i = 0; i<result.length(); i++){
                JSONObject jo = result.getJSONObject(i);
                String id = jo.getString(konfigurasi.TAG_ID);

                String name = jo.getString(konfigurasi.TAG_NAMA);
                HashMap<String,String> mhs = new HashMap<>();
                mhs.put(konfigurasi.TAG_ID,id);
                mhs.put(konfigurasi.TAG_NAMA,name);
                list.add(mhs);
            }
        }
        catch (JSONException e) { e.printStackTrace();
        }
        ListAdapter adapter = new SimpleAdapter(
                TampilSemuaMhs.this, list, R.layout.list_item,
                new String[]{konfigurasi.TAG_ID,konfigurasi.TAG_NAMA},
                new int[]{R.id.id, R.id.name});
        listView.setAdapter(adapter);
    }
    private void getJSON(){
        class GetJSON extends AsyncTask<Void,Void,String>{
            ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(TampilSemuaMhs.this,"Mengambil Data","Mohon Tunggu...",false,false);
            }
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                JSON_STRING = s;
                showMhs();
            }
            @Override protected String doInBackground(Void... params) { RequestHandler rh = new RequestHandler();
                Log.d("testing","test");
                String s = rh.sendGetRequest(konfigurasi.URL_GET_ALL);
                Log.d("response",s);

                return s;
            }
        }
        GetJSON gj = new GetJSON();
        gj.execute();
    }
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Intent intent = new Intent(this, TampilMhs.class);
        HashMap<String,String> map =(HashMap)parent.getItemAtPosition(position);
        String mhsId = map.get(konfigurasi.TAG_ID).toString();
        intent.putExtra(konfigurasi.MHS_ID,mhsId);
        startActivity(intent);
    }
}

Membuat Activity ListView

  • Buat activity lagi yang berisi layout list_item.xml dan class ListView. Caranya pembuatannya sama dengan point pertama, hanya saja bagian Activity name silahkan isikan dengan “ListView” dan Layout Name isikan dengan “list_item”. Jika sudah klik Finish.


  • Class ListView.java tidak usah ditambahkan kode-kode java lagi. Biarkan default saja seperti saat kita membuat class baru. sedangkan untuk list_item.xml Isikan kode berikut ini pada layout :
<?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">

    <TextView
        android:id="@+id/id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>
package com.naskahkode.crud_phpmysql;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

public class ListView extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_item);
    }
}

Membuat Layout & Activity Untuk Menampilkan Detail Data

Activity ini berfungsi untuk menampilkan detail salah satu data mahasiswa yang diklik dari tampilan semua data mahasiswa. Activity ini terdiri dari Layout activity_tampil_mhs.xml dan Class TampilMhs.java untuk Cara pembuatannya sama dengan di atas.



  • Untuk layout activity_tampil_mhs.xml sendiri kita ketikan kode programya seperti di bawah ini
<?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:orientation="vertical"
    android:layout_height="match_parent"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="16dp"
    android:paddingBottom="16dp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ID Mahasiswa :" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextId" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Nama Mahasiswa :" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextName" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="N R P :" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextNRP" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Kelas :" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextKelas" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Blog URL :" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextBlog" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Update Data Mahasiswa"
        android:id="@+id/buttonUpdate" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hapus Data"
        android:id="@+id/buttonDelete" />
</LinearLayout>
  • Untuk Perview tampilan dari layout di atas akan tampak seperti gambar di bawah ini


  • Untuk kode java pada class TampilMhs.java kita ketikan seperti berikut :
package com.naskahkode.crud_phpmysql;

import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;

public class TampilMhs extends AppCompatActivity implements View.OnClickListener{
    private EditText editTextId;
    private EditText editTextName;
    private EditText editTextNRP;
    private EditText editTextKelas;
    private EditText editTextBlog;
    private Button buttonUpdate;
    private Button buttonDelete;
    private String id;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tampil_mhs);
        Intent intent = getIntent();
        id = intent.getStringExtra(konfigurasi.MHS_ID);
        editTextId = (EditText) findViewById(R.id.editTextId);
        editTextName = (EditText) findViewById(R.id.editTextName);
        editTextNRP = (EditText) findViewById(R.id.editTextNRP);
        editTextKelas = (EditText) findViewById(R.id.editTextKelas);
        editTextBlog = (EditText) findViewById(R.id.editTextBlog);
        buttonUpdate = (Button) findViewById(R.id.buttonUpdate);
        buttonDelete = (Button) findViewById(R.id.buttonDelete);
        buttonUpdate.setOnClickListener(this);
        buttonDelete.setOnClickListener(this);
        editTextId.setText(id);
        getMhs();
    }
    private void getMhs(){
        class GetMhs extends AsyncTask<Void,Void,String>{ ProgressDialog loading;
            @Override
            protected void onPreExecute() { super.onPreExecute();
                loading = ProgressDialog.show(TampilMhs.this,"Fetching...","Wait...",false,false);
            }
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                showMhs(s);
            }
            @Override
            protected String doInBackground(Void... params) { RequestHandler rh = new RequestHandler();
                String s = rh.sendGetRequestParam(konfigurasi.URL_GET_EMP,id);
                return s;
            }
        }
        GetMhs ge = new GetMhs();
        ge.execute();
    }
    private void showMhs(String json){
        try {
            JSONObject jsonObject = new JSONObject(json);
            JSONArray result = jsonObject.getJSONArray(konfigurasi.TAG_JSON_ARRAY);
            JSONObject c = result.getJSONObject(0);
            String name = c.getString(konfigurasi.TAG_NAMA);
            String nrp = c.getString(konfigurasi.TAG_NRP);
            String kelas = c.getString(konfigurasi.TAG_KELAS);
            String blog = c.getString(konfigurasi.TAG_BLOG);
            editTextName.setText(name);
            editTextNRP.setText(nrp);
            editTextKelas.setText(kelas);
            editTextBlog.setText(blog);
        }
        catch (JSONException e) { e.printStackTrace();
        }
    }
    private void updateMhs(){
        final String name = editTextName.getText().toString().trim();
        final String nrp = editTextNRP.getText().toString().trim();
        final String kelas = editTextKelas.getText().toString().trim();
        final String blog = editTextBlog.getText().toString().trim();
        class UpdateMhs extends AsyncTask<Void,Void,String>{ ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(TampilMhs.this,"Updating...","Wait...",false,
                        false);
            }
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                Toast.makeText(TampilMhs.this,s,Toast.LENGTH_LONG).show();
            }
            @Override
            protected String doInBackground(Void... params) { HashMap<String,String> hashMap = new HashMap<>();
                hashMap.put(konfigurasi.KEY_MHS_ID,id);
                hashMap.put(konfigurasi.KEY_MHS_NAMA,name);
                hashMap.put(konfigurasi.KEY_MHS_NRP,nrp);
                hashMap.put(konfigurasi.KEY_MHS_KELAS,kelas);
                hashMap.put(konfigurasi.KEY_MHS_BLOG,blog);
                RequestHandler rh = new RequestHandler();
                String s = rh.sendPostRequest(konfigurasi.URL_UPDATE_EMP,hashMap);
                return s;
            }
        }
        UpdateMhs ue = new UpdateMhs();
        ue.execute();
    }
    private void deleteMhs(){
        class DeleteMhs extends AsyncTask<Void,Void,String> { ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(TampilMhs.this, "Updating...", "Tunggu...", false, false);
            }
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                Toast.makeText(TampilMhs.this, s, Toast.LENGTH_LONG).show();
            }
            @Override
            protected String doInBackground(Void... params) { RequestHandler rh = new RequestHandler();
                String s = rh.sendGetRequestParam(konfigurasi.URL_DELETE_EMP, id);
                return s;
            }
        }
        DeleteMhs de = new DeleteMhs();
        de.execute();
    }
    private void confirmDeleteMhs(){
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setMessage("Apakah Kamu Yakin Ingin Menghapus Data ini?");
        alertDialogBuilder.setPositiveButton("Ya", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface arg0, int arg1) {
                        deleteMhs();
                        startActivity(new Intent(TampilMhs.this,TampilSemuaMhs.class));
                    }
                }
        );
        alertDialogBuilder.setNegativeButton("Tidak", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface arg0, int arg1) { } });
        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }
    @Override
    public void onClick(View v) { if(v == buttonUpdate){ updateMhs();
    }
        if(v == buttonDelete){ confirmDeleteMhs();
        }
    }
}

Persiapan Konfigurasi Program & cek AndroidManifest

  • Selanjutnya silahkan buat class baru dengan nama konfigurasi.java. Klik kanan pada direktori nama package, caranya Pilih New > Java Class
  • Lalu tambahkan kode-kode berikut di bawah ini
package com.naskahkode.crud_phpmysql;

public class konfigurasi {
    public static final String URL_ADD="http://android.unggasid.com/mhs/tambahMhs.php";
    public static final String URL_GET_ALL = "http://android.unggasid.com/mhs/tampilSemuaMhs.php";
    public static final String URL_GET_EMP ="http://android.unggasid.com/mhs/tampilMhs.php?id=";
    public static final String URL_UPDATE_EMP = "http://android.unggasid.com/mhs/updateMhs.php";
    public static final String URL_DELETE_EMP = "http://android.unggasid.com/mhs/hapusMhs.php?id=";

    public static final String KEY_MHS_ID = "id";
    public static final String KEY_MHS_NAMA = "name";
    public static final String KEY_MHS_NRP = "nrp";
    public static final String KEY_MHS_KELAS = "kelas";
    public static final String KEY_MHS_BLOG = "blog";

    public static final String TAG_JSON_ARRAY="result";
    public static final String TAG_ID = "id";
    public static final String TAG_NAMA = "name";
    public static final String TAG_NRP = "nrp";
    public static final String TAG_KELAS = "kelas";
    public static final String TAG_BLOG = "blog";

    public static final String MHS_ID = "mhs_id";
}
  • Setelah itu buat class RequestHandler.java, caranya sama dengan yang di atas. Class ini berfungsi untuk menangani permintaan jaringan. Untuk kode-kodenya sebagai berikut
package com.naskahkode.crud_phpmysql;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;

public class RequestHandler {
    //Metode yang digunakan mengirim httpPostRequest
    public String sendPostRequest(String requestURL, HashMap<String, String> postDataParams)
    {
        URL url;
        StringBuilder sb = new StringBuilder();
        try {
            url = new URL(requestURL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(15000);
            conn.setConnectTimeout(15000);
            conn.setRequestMethod("POST");
            conn.setDoInput(true);
            conn.setDoOutput(true);

            OutputStream os = conn.getOutputStream();
            BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(os, "UTF-8"));
            writer.write(getPostDataString(postDataParams));
            writer.flush();
            writer.close();
            os.close();
            int responseCode = conn.getResponseCode();
            if (responseCode == HttpsURLConnection.HTTP_OK) {
                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                sb = new StringBuilder();
                String response;
                while ((response = br.readLine()) != null){ sb.append(response);
                }
            }
        }
        catch (Exception e) { e.printStackTrace();
        }
        return sb.toString();
    }
    public String sendGetRequest(String requestURL){
        StringBuilder sb =new StringBuilder();
        try {
            URL url = new URL(requestURL);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            BufferedReader bufferedReader = 
            new BufferedReader(new InputStreamReader(con.getInputStream()));
            String s;
            while((s=bufferedReader.readLine())!=null){ sb.append(s+"\n");
            }
        }
        catch(Exception e){ }
        return sb.toString();
    }
    public String sendGetRequestParam(String requestURL, String id)
    { StringBuilder sb =new StringBuilder();
        try {
            URL url = new URL(requestURL+id);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            BufferedReader bufferedReader = 
            new BufferedReader(new InputStreamReader(con.getInputStream()));
            String s; while((s=bufferedReader.readLine())!=null){ sb.append(s+"\n");
            }
        }
        catch(Exception e){ }
        return sb.toString();
    }
    private String getPostDataString(HashMap<String, String> params) 
    throws UnsupportedEncodingException { StringBuilder result = new StringBuilder();
        boolean first = true;
        for (Map.Entry<String, String> entry : params.entrySet()) {
            if (first)
                first = false;
            else
                result.append("&");
            result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
        }
        return result.toString();
    }
}
  • Terakhir Atur AndroidManifest.xml nya menjadi seperti berikut
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.naskahkode.crud_phpmysql">
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:usesCleartextTraffic="true"
        android:supportsRtl="true"
        android:theme="@style/Theme.CRUD_PHPMySQL">
        <activity android:name=".TampilMhs"></activity>
        <activity android:name=".ListView" />
        <activity android:name=".TampilSemuaMhs" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
  • Sekarang coba anda jalankan dengan menggunakan Emulator yang ada pada Android Studio atau menggunakan Pisical Drive android anda, tampilan dari program di atas akan tampak seperti video di bawah ini

Kalian bisa cek apakah data yang kalian masukan sudah tersimpan di database server atau belum dengan cara buka browser dan ketikan link http://android.unggasid.com/mhs/ di browser kalian. halaman web ini hanya dapat menampilkan data yang berhasil di simpan dalam database saja, dan tampilannya akan tampak seperti gambar di bawah ini



Sumber :
https://www.niagahoster.co.id/blog/cara-membuat-crud-dengan-php-dan-mysql/
https://brainmatics.com/php-mysql-fundamentals/
https://www.dicoding.com/blog/apa-itu-web-service/



Tugas Modul 13

  1. Tambahkan fungsi spinner pada form Update data di kolom Kelas, agar user dapat melihat pilihan kelas yang ada dan dapat mengganti nya ketika akan melakukan edit data.
  2. Buat konten Blog dan video seperti di atas, kalian cukup buat sampai bisa input, edit, dan delete data di DB server yang telah saya sediakan. buatkan video demo program ketika kalian melakukan input, edit dan hapus data di apps yang telah kalian buat.
  3. Inputkan data dalam DB server dengan data real kalian, dan jangan di hapus sebagai bukti bahwa kalian telah berhasil melakukan praktikum modul 13

 
  • Jawaban Modul 13

    Ubah activity_tampil_mhs.xml menjadi seperti code dibawah
<?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:orientation="vertical"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
tools:context=".MainActivity">
<!--naskahkode.com-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ID Mahasiswa :" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editTextId" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Nama Mahasiswa :" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editTextName" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="N R P :" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editTextNRP" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Kelas :" />

<!-- <EditText-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:id="@+id/editTextKelas" />-->


<Spinner
android:id="@+id/spinnerKelas2"
android:spinnerMode="dropdown"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Blog URL :" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editTextBlog" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Update Data Mahasiswa"
android:id="@+id/buttonUpdate" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hapus Data"
android:id="@+id/buttonDelete" />
</LinearLayout>

  • dan Ubah TampilMhs.java menjadi code dibawah ini
package com.naskahkode.crud_phpmysql;

import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;


import android.widget.ArrayAdapter;


public class TampilMhs extends AppCompatActivity implements View.OnClickListener{
private EditText editTextId;
private EditText editTextName;
private EditText editTextNRP;

// private EditText editTextKelas;
private Spinner spinnerKelas2;


private EditText editTextBlog;
private Button buttonUpdate;
private Button buttonDelete;
private String id;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tampil_mhs);
Intent intent = getIntent();
id = intent.getStringExtra(konfigurasi.MHS_ID);
editTextId = (EditText) findViewById(R.id.editTextId);
editTextName = (EditText) findViewById(R.id.editTextName);
editTextNRP = (EditText) findViewById(R.id.editTextNRP);

// editTextKelas = (EditText) findViewById(R.id.editTextKelas);
spinnerKelas2 = (Spinner) findViewById(R.id.spinnerKelas2);


editTextBlog = (EditText) findViewById(R.id.editTextBlog);
buttonUpdate = (Button) findViewById(R.id.buttonUpdate);
buttonDelete = (Button) findViewById(R.id.buttonDelete);
buttonUpdate.setOnClickListener(this);
buttonDelete.setOnClickListener(this);
editTextId.setText(id);
getMhs();
}
private void getMhs(){
class GetMhs extends AsyncTask<Void,Void,String>{ ProgressDialog loading;
@Override
protected void onPreExecute() { super.onPreExecute();
loading = ProgressDialog.show(TampilMhs.this,"Fetching...","Wait...",false,false);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
loading.dismiss();
showMhs(s);
}
@Override
protected String doInBackground(Void... params) { RequestHandler rh = new RequestHandler();
String s = rh.sendGetRequestParam(konfigurasi.URL_GET_EMP,id);
return s;
}
}
GetMhs ge = new GetMhs();
ge.execute();
}
private void showMhs(String json){
try {
JSONObject jsonObject = new JSONObject(json);
JSONArray result = jsonObject.getJSONArray(konfigurasi.TAG_JSON_ARRAY);
JSONObject c = result.getJSONObject(0);
String name = c.getString(konfigurasi.TAG_NAMA);
String nrp = c.getString(konfigurasi.TAG_NRP);
String kelas = c.getString(konfigurasi.TAG_KELAS);
String blog = c.getString(konfigurasi.TAG_BLOG);
editTextName.setText(name);
editTextNRP.setText(nrp);

// editTextKelas.setText(kelas);
spinnerKelas2 = (Spinner) findViewById(R.id.spinnerKelas2);
String[] spinnerItem = new String[]{"TI-1","TI-2","TI-3","TI-Mlm"};
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item,spinnerItem);
spinnerKelas2.setAdapter(adapter);


editTextBlog.setText(blog);
}
catch (JSONException e) { e.printStackTrace();
}
}
private void updateMhs(){
final String name = editTextName.getText().toString().trim();
final String nrp = editTextNRP.getText().toString().trim();

// final String kelas = editTextKelas.getText().toString().trim();
final String kelas =(String) spinnerKelas2.getSelectedItem();


final String blog = editTextBlog.getText().toString().trim();
class UpdateMhs extends AsyncTask<Void,Void,String>{ ProgressDialog loading;
@Override
protected void onPreExecute() {
super.onPreExecute();
loading = ProgressDialog.show(TampilMhs.this,"Updating...","Wait...",false,
false);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
loading.dismiss();
Toast.makeText(TampilMhs.this,s,Toast.LENGTH_LONG).show();
}
@Override
protected String doInBackground(Void... params) { HashMap<String,String> hashMap = new HashMap<>();
hashMap.put(konfigurasi.KEY_MHS_ID,id);
hashMap.put(konfigurasi.KEY_MHS_NAMA,name);
hashMap.put(konfigurasi.KEY_MHS_NRP,nrp);
hashMap.put(konfigurasi.KEY_MHS_KELAS,kelas);
hashMap.put(konfigurasi.KEY_MHS_BLOG,blog);
RequestHandler rh = new RequestHandler();
String s = rh.sendPostRequest(konfigurasi.URL_UPDATE_EMP,hashMap);
return s;
}
}
UpdateMhs ue = new UpdateMhs();
ue.execute();
}
private void deleteMhs(){
class DeleteMhs extends AsyncTask<Void,Void,String> { ProgressDialog loading;
@Override
protected void onPreExecute() {
super.onPreExecute();
loading = ProgressDialog.show(TampilMhs.this, "Updating...", "Tunggu...", false, false);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
loading.dismiss();
Toast.makeText(TampilMhs.this, s, Toast.LENGTH_LONG).show();
}
@Override
protected String doInBackground(Void... params) { RequestHandler rh = new RequestHandler();
String s = rh.sendGetRequestParam(konfigurasi.URL_DELETE_EMP, id);
return s;
}
}
DeleteMhs de = new DeleteMhs();
de.execute();
}a
private void confirmDeleteMhs(){
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setMessage("Apakah Kamu Yakin Ingin Menghapus Data ini?");
alertDialogBuilder.setPositiveButton("Ya", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
deleteMhs();
startActivity(new Intent(TampilMhs.this,TampilSemuaMhs.class));
}
}
);
alertDialogBuilder.setNegativeButton("Tidak", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) { } });
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
@Override
public void onClick(View v) { if(v == buttonUpdate){ updateMhs();
}
if(v == buttonDelete){ confirmDeleteMhs();
}
}
}
  • Hasil setelah di run seperti video dibawah ini

 

إرسال تعليق