Mengambil Data MySQL ke Android Menggunakan PHP

Akhirnya sampai juga pada tutorial ini setelah beberapa hari saya mesti berkerja keras mencuri waktu luang untuk mengisi artikel website icaksama.com. Semoga ilmu yang saya bagi dapat bermanfaat untuk kalian semua. Dan pada kesempatan ini saya akan menunjukan cara mengambil data mysql ke android. Tutoial ini hanya berkerja untuk android versi 4 ke atas karena dari pihak android mewajibkan pengambilan data harus menggunakan kelas turunan dari AsyncTask. Sedangkan dari beberapa tutorial yang beredar di internet masih menggunakan program untuk versi android 4 ke bawah yang tanpa menggunakan penurunan kelas AsyncTask sehingga saat aplikasi di pakai pada android versi 4 ke atas tidak akan berkerja. Alur sistem dari aplikasi yang akan kita buat nanti adalah sebagai berikut :

Mengambil Data MySQL ke Android Menggunakan PHP

Dari gambar diatas, kenapa Android harus melalui PHP untuk mengambil data dalam database MySQL ? Karena Android tidak bisa mengirimkan permintaan data secara langsung ke database sehingga harus melalui PHP. PHP mengirimkan Query ke database yang kemudian data tersebut diproses dan ditampilkan dalam format JSON. Format JSON inilah yang akan diterima oleh android sebagai data yang di ambil dari database. Mari simak lebih lanjut langkah-langkah cara membuatnya.

Sebelum memulai langkah-langkah dalam tutorial ini, kamu wajib membaca artikel  Cara Membuat ListView Android Modifikasi karena tutorial tersebut berhubungan dengan tutorial ini.

Langkah 1: Membuat Database dan Tabel

Buat database di MySQL dengan nama cruddb dan buat tabel di dalamnya dengan nama selecttb kemudian buat nama field dan tipe datanya sebagai berikut :

Mengambil Data MySQL ke Android Menggunakan PHP

Bagian kdselect dijadikan Primary Key dan Auto Increment.

Langkah 2: Membuat API PHP Sederhana

Membuat file *.php yang akan menjadi perantara dalam pengambilan data. Kita memanfaatkan XAMPP sebagai server yang akan kita gunakan untuk menyimpan file PHP. File php tersebut berada dalam folder htdocs di XAMPP. Buat struktur direktorinya menjadi seperti ini :

Mengambil Data MySQL ke Android Menggunakan PHP

Berikut ini adalah isi dari tiap foldernya :

  • android : getdata.php
  • config : koneksi.php
  • gambar : data1.png dan data2.png

Program getdata.php

Program dibawah ini adalah program yang akan mengambil data dari database MySQL kemudian memprosesnya dalam format JSON lalu di tampilkan dalam browser. Jika kamu panggil file ini dalam URL maka akan terlihat data dalam format JSON. Sebenernya android tidak mengambil data on the fly namun mengambil data yang di tampilkan dalam browser.

<?php
  //Memanggil file koneksi.php
  include_once '../config/koneksi.php';
  //Mengambil data dari tabel selecttb
  $result = mysql_query("SELECT * FROM selecttb");
  //Mengubah data ke array
  $rows = array();
  while ($r = mysql_fetch_assoc($result)) {
    $rows[] = $r;
  }
  //Mengubah format data ke JSON
  $data = "{select:" . json_encode($rows) . "}";
  echo $data;
?>

Program koneksi.php

Program dibawah ini adalah untuk membuka koneksi ke database.

<?php
  //Membuka koneksi
  mysql_connect("localhost", "root", "");
  //Memilih Database
  mysql_select_db("cruddb");
?>

Langkah 3: Membuat Project Android

Buat new Project di eclipse. Membuat Android di Eclipse
Silakan baca tutorial sebelumnya pada kategori android agar lebih paham, Selebihnya kamu harus paham bagaimana menambah program dibawah ini.

Langkah 4: Membuat Class CustomHttpClient.java 

Buat class CustomHttpClient.java lalu isi programnya dibawah ini :

package icaksama.com.icaksamacrud;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

//class ini digunakan untuk proses client dalam akese ke media internet
public class CustomHttpClient {
 public static final int HTTP_TIMOUT = 30 * 1000;
 private static HttpClient mHttpClient;
 private static HttpClient getHttpClient() {
  if (mHttpClient == null) {
   mHttpClient = new DefaultHttpClient();
   final HttpParams param = mHttpClient.getParams();
   HttpConnectionParams.setConnectionTimeout(param, HTTP_TIMOUT);
   HttpConnectionParams.setSoTimeout(param, HTTP_TIMOUT);
   ConnManagerParams.setTimeout(param, HTTP_TIMOUT);

  }
  return mHttpClient;
 }
 public static String executeHttpPost(String url, ArrayList < NameValuePair > postParameters) throws Exception {
  BufferedReader in = null;
  try {
   HttpClient client = getHttpClient();
   HttpPost request = new HttpPost(url);
   UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
   request.setEntity(formEntity);
   HttpResponse response = client.execute(request); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

   StringBuffer sb = new StringBuffer("");
   String line = "";
   String NL = System.getProperty("line.separator");
   while ((line = in .readLine()) != null) {
    sb.append(line + NL);
   } in .close();
   String result = sb.toString();
   return result;

  } finally {
   if ( in != null) {
    try { in .close();
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }

 }
 public static String executeHttpGet(String url) throws Exception {
  BufferedReader in = null;
  try {
   HttpClient client = getHttpClient();
   HttpGet request = new HttpGet();
   request.setURI(new URI(url));
   HttpResponse response = client.execute(request); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

   StringBuffer sb = new StringBuffer("");
   String line = "";
   String NL = System.getProperty("line.separator");
   while ((line = in .readLine()) != null) {
    sb.append(line + NL);
   } in .close();
   String result = sb.toString();
   return result;
  } finally {
   if ( in != null) {
    try { in .close();
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }
 }

}

Langkah 5: Ubah Program MainActivity.java

Tambahkan program dibawah ini pada MainActivity.java.

package icaksama.com.icaksamacrud;

import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;

public class < strong > MainActivity < /strong>extends ListActivity {

//Array untuk menampung data yang di ambil dari MySQL
private String[] kdSelect;
private String[] Nama;
private String[] subNama;
private String[] Gambar;

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 //Mengeksekusi kelas GetData untuk mengirim permintaan ke MySQL
 new GetData()
  .execute("http://192.168.56.1/IcaksamaCrud/android/getdata.php");
}

//Method untuk mengeluarkan event saat list di click
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
 Toast.makeText(getBaseContext(), "Terpilih " + Nama[position],
  Toast.LENGTH_LONG).show();
}

//Class GetData yang menuruni kelas AsyncTask untuk melakukan requset data dari internet
private class GetData extends AsyncTask < String, Void, String > {

 // Instansiasi class dialog
 ProgressDialog dialog = new ProgressDialog(MainActivity.this);
 String Content;
 String Error = null;
 // membuat object class JSONObject yang digunakan untuk menangkap data
 // dengan format json
 JSONObject jObject;
 // instansiasi class ArrayList
 ArrayList < NameValuePair > data = new ArrayList < NameValuePair > ();

 @Override
 protected String doInBackground(String...params) {
  try {
   Content = CustomHttpClient.executeHttpPost(
    "http://192.168.56.1/IcaksamaCrud/android/getdata.php",
    data);
  } catch (ClientProtocolException e) {
   Error = e.getMessage();
   cancel(true);
  } catch (IOException e) {
   Error = e.getMessage();
   cancel(true);
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return Content;
 }

 @Override
 protected void onPreExecute() {
  super.onPreExecute();
  // menampilkan dialog pada saat proses pengambilan data dari
  // internet
  this.dialog.setMessage("Loading Data..");
  this.dialog.show();
 }

 @Override
 protected void onPostExecute(String result) {
  // menutup dialog saat pengambilan data selesai
  this.dialog.dismiss();
  if (Error != null) {
   Toast.makeText(getBaseContext(), "Error Connection Internet",
    Toast.LENGTH_LONG).show();
  } else {
   try {
    // instansiasi kelas JSONObject
    jObject = new JSONObject(Content);
    // mengubah json dalam bentuk array
    JSONArray menuitemArray = jObject.getJSONArray("select");

    // mendeskripsikan jumlah array yang bisa di tampung
    kdSelect = new String[menuitemArray.length()];
    Nama = new String[menuitemArray.length()];
    subNama = new String[menuitemArray.length()];
    Gambar = new String[menuitemArray.length()];

    // mengisi variable array dengan data yang di ambil dari
    // internet yang telah dibuah menjadi Array
    for (int i = 0; i < menuitemArray.length(); i++) {
     kdSelect[i] = menuitemArray.getJSONObject(i)
      .getString("kdselect").toString();
     Nama[i] = menuitemArray.getJSONObject(i)
      .getString("nama").toString();
     subNama[i] = menuitemArray.getJSONObject(i)
      .getString("subnama").toString();
     Gambar[i] = "http://192.168.56.1/IcaksamaCrud/gambar/" + menuitemArray.getJSONObject(i)
      .getString("gambar").toString();
    }
    // instansiasi class ListAdapter (Buka class ListAdapter)
    ListAdapter adapter = new ListAdapter(getBaseContext(),
     Nama, subNama, Gambar);
    setListAdapter(adapter);
   } catch (JSONException ex) {
    Logger.getLogger(MainActivity.class.getName()).log(
     Level.SEVERE, null, ex);
   }
  }
 }
}

}

Jika dilihat pada program di atas, terdapat IP 192.168.56.1. IP tersebut adalah kata lain dari localhost. IP tersebut terbentuk karena emulator yang saya gunakan menggunakan virtual box jadi harus ada ip penghubung ke komputer asli untuk mengakses localhost atau 127.0.0.1. Sedangkan IP untuk emulator bawaan dari android adalah 10.0.2.2. Jadi sesuaikan penggunaan IP tersebut sesuai emulatornya. Intinya IP tersebut terhubung ke komputer asli yang memilik server local XAMPP. IP tersebut dapat diganti menggunakan nama domain jika file php sudah di upload ke internet. Intinya adalah URL berikut menuju ke file getdata.php.

Ada beberapa kasus saat emulator virtual box mencoba mengkses ke komputer asli menggunakan IP dan ternyata aksesnya ditolak. Kasus ini disebabkan oleh firewall yang masih aktif, jadi jika akses IP terblok atau gagal silahkan matikan firewallnya. Bagaimana cara mengecek IP yang terblok ? Silahkan kamu masuk ke browser emulator lalu masukan IP tersebut. Jika IP tersebut tidak merespon maka cek kembali IPnya mungkin ada salah penulisan jika tidak berarti firewall yang membuat IP tidak merespon.

Ada beberapa kelas tambahan lagi seperti CustomHttpClient.java untuk meminta permintaan ke internet dengan atau tanpa parameter, DownloadImageTask.java untuk menampilkan gambar dari internet pada Android, ListAdapter.java untuk memodifikasi ListView.

Kelas diatas bisa berjalan biarpun tanpa menggunakan layout karena telah menuruni kelas ListActivity.
Demikian tutorial kali ini semoga bermanfaat! 🙂
Download Projectnya disini

39 Comments

Leave a Reply