TUTORIAL MEMBUAT APLIKASI CRUD (CREATE, READ, UPDATE, DELETE) SEDERHANA DI ANDROID DENGAN DATABASE DI SERVER (PART 1)

Well, kata dokter lagi ga boleh banyak pikiran gitu. Jadinya aku tinggalin dulu skripsi dan hal-hal berbau kuliah lainnya. Tapi kerjaanku jadi luntang luntung ga jelas gitu, puasanya jadi kerasa banget. Hehe.. Jadilah aku nglakuin hobi aku aja... NULIS DI BLOG!! dan akhirnya tulisanku kali ini berbobot. Haha. Karena bukan curhatan. Walo ujung-ujungnya koding juga, tapi ga mbebanin pikiran kok. Serius!

Oke langsung aja. Sesuai judulnya, kali ini aku tulis tentang membuat aplikasi Crud di android tapi database-nya di server, berhubung banyak temen-temen kampus yang sering nanyain juga. Hehe. Jadi nantinya aplikasi ini bisa membaca data dari database, memasukan data, mengupdate, dan menghapusnya juga.

Bisa didownload aplikasinya di sini

Code lengkap dan apk-nya bisa didownload  DI SINI

Kira-kira nanti jadinya seperti screenshot berikut :


Oke langsung aja... Yang perlu di persiapkan adalah :

  1. Database server dan web hosting, kalo aku sih pake http://000webhost.com yang "free" akun.
  2. Android Studio (for those who have ever said I am too conservative with eclipse, sekrang udah bisa move on ke android studio nih. Hehe)
  3. Notepad ++ (atau sejenisnya) untuk membangun script php.
  4. Internet stabil
  5. Kopi

 Langkah 1


Buat database-nya dulu di server masing - masing! Kalo sesuai yang ada di  http://000webhost.com  pakenya phpMyAdmin. Kira-kira strukturnya sesuai gambar berikut :

Nama tabelnya "mahasiswa" dengan tiga field yaitu "id_mhs" , "nama", dan "nim". id_mhs bertipe int dan auto_increment, sementara nama dan nim bertipe varchar dengan panjang 100. Udah gitu aja, ga usah ribet-ribet.

Langkah 2 

Buat API-nya! API atau Application Programming Interface dipake sebagai antarmuka aplikasi android ke database server atau sebaliknya. Jadi, aplikasi android itu kalo mau mengakses ke database harus melalui API dulu. API ini dibangun menggunakan bahasa php, dan nanti kita hosting-kan di web hosting  http://000webhost.com juga.

Ada 4 API yang akan kita buat, yaitu :
  1. API untuk membaca data mahasiswa (read_mhs)
  2. API untuk menambah data mahasiswa (create_mhs)
  3. API untuk memperbarui data mahasiswa (update_mhs)
  4. API untuk menghapus data mahasiswa (delete_mhs)
Langkah 2.1

Kita buat dulu db_config.php sebagai konfigurasi database-nya. Berikut script-nya :

<?php
 
/*
 * All database connection variables
 */
 
define('DB_USER', "MASUKAN_USER_DATABASEMU_DISINI"); // db user
define('DB_PASSWORD', "MASUKAN_PASSWORD_DATABASEMU_DISINI"); // db password
define('DB_DATABASE', "MASUKAN_NAMA_DATABASEMU_DISINI"); // database name
define('DB_SERVER', "MASUKAN_NAMA_SERVER_DATABASEMU_DISINI"); // db server
?>
Langkah 2.2

Membuat db_connect.php

<?php
 
/**
 * A class file to connect to database
 */
class DB_CONNECT {
 
    // constructor
    function __construct() {
        // connecting to database
        $this->connect();
    }
 
    // destructor
    function __destruct() {
        // closing db connection
        $this->close();
    }
 
    /**
     * Function to connect with database
     */
    function connect() {
        // import database connection variables, lokasinya sesuaikan lokasi db_config.php punyamu, kalo aku di dalam direktori "simple_crud"
        require_once '../simple_crud/db_config.php';
 
        // Connecting to mysql database
        $con = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD) or die(mysql_error());
 
        // Selecing database
        $db = mysql_select_db(DB_DATABASE) or die(mysql_error()) or die(mysql_error());
 
        // returing connection cursor
        return $con;
    }
 
    /**
     * Function to close db connection
     */
    function close() {
        // closing db connection
        mysql_close();
    }
 
}
 
?>
Langkah 2.3

Membuat read_mhs.php

<?php

/*
 * Berikut adalah kelas untuk membaca data mahasiswa
 */

// array for JSON response
$response = array();
 
// include db connect class
require_once '../simple_crud/db_connect.php';
 
// connecting to db
$db = new DB_CONNECT();
 
 
$sql = "SELECT * FROM mahasiswa";
$mhs_result = mysql_query ($sql) or die(mysql_error()); //run the query
 
 // check for empty result
 if (mysql_num_rows($mhs_result) > 0) {

  $response["mahasiswa"] = array();
 
  while ($row = mysql_fetch_array($mhs_result)) {
   // temp user array
   $mahasiswa = array();
   $mahasiswa["id_mhs"] = $row["id_mhs"];
   $mahasiswa["nama"] = $row["nama"];
   $mahasiswa["nim"] = $row["nim"];
 
   // push single puasa into final response array
   array_push($response["mahasiswa"], $mahasiswa);
  }
  // success
  $response["success"] = 1;
 
  // echoing JSON response
  echo json_encode($response);
 } else {
  $response["success"] = 0;
  $response["message"] = "Tidak ada data mahasiswa";
 
  // echo no users JSON
  echo json_encode($response);
 }
?>

Langkah 2.4

Membuat create_mhs.php

<?php
 
/*
 * Berikut adalah kelas untuk menambah data mahasiswa
 */
 
// array for JSON response
$response = array();
 
// check for required fields
if (isset($_POST['nama']) && isset($_POST['nim']) ) {
 
    $nama = $_POST['nama'];
    $nim = $_POST['nim'];
 
    // include db connect class
    require_once '../simple_crud/db_connect.php'; 
 
    // connecting to db
    $db = new DB_CONNECT();
 
    // mysql inserting a new row
    $result = mysql_query("INSERT INTO mahasiswa(nama, nim) VALUES('$nama', '$nim')");
 
    // check if row inserted or not
    if ($result) {
        // successfully inserted into database
        $response["success"] = 1;
        $response["message"] = "successfully created.";
 
        // echoing JSON response
        echo json_encode($response);
    } else {
        // failed to insert row
        $response["success"] = 0;
        $response["message"] = "Oops! An error occurred.";
 
        // echoing JSON response
        echo json_encode($response);
    }
} else {
    // required field is missing
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";
 
    // echoing JSON response
    echo json_encode($response);
}
?>

Langkah 2.5

Membuat update_mhs.php

<?php
 

/*
 * Berikut adalah kelas untuk meng-update data mahasiswa
 */
 
// array for JSON response
$response = array();
 
// check for required fields
if (isset($_POST['id_mhs']) && isset($_POST['nama']) && isset($_POST['nim'])) {
 
    $id_mhs = $_POST['id_mhs'];
    $nama = $_POST['nama'];
    $nim = $_POST['nim'];
 
    // include db connect class
    require_once '../simple_crud/db_connect.php';
 
    // connecting to db
    $db = new DB_CONNECT();
 
    $result = mysql_query("UPDATE mahasiswa SET nama = '$nama', nim = '$nim' WHERE id_mhs = $id_mhs");
 
    // check if row inserted or not
    if ($result) {
        // successfully updated
        $response["success"] = 1;
        $response["message"] = "successfully updated.";
 
        // echoing JSON response
        echo json_encode($response);
    } else {
 
    }
} else {
    // required field is missing
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";
 
    // echoing JSON response
    echo json_encode($response);
}
?>

Langkah 2.6

Membuat delete_mhs.php


<?php
 

/*
 * Berikut adalah kelas untuk menghapus data mahasiswa
 */
 
// array for JSON response
$response = array();
 
// check for required fields
if (isset($_POST['id_mhs'])) {
    $id_mhs = $_POST['id_mhs'];
 
    // include db connect class
    require_once '../simple_crud/db_connect.php';
 
    // connecting to db
    $db = new DB_CONNECT();
 
    $result = mysql_query("DELETE FROM mahasiswa WHERE id_mhs = $id_mhs");
 
    // check if row deleted or not
    if (mysql_affected_rows() > 0) {
        // successfully updated
        $response["success"] = 1;
        $response["message"] = "successfully deleted";
 
        // echoing JSON response
        echo json_encode($response);
    } else {
        // no product found
        $response["success"] = 0;
        $response["message"] = "No found";
 
        // echo no users JSON
        echo json_encode($response);
    }
} else {
    // required field is missing
    $response["success"] = 0;
    $response["message"] = "Required field(s) is missing";
 
    // echoing JSON response
    echo json_encode($response);
}
?>

ke-enam file php di atas aku hosting dan taruh semuanya di dalam satu folder "simple_crud" makanya pada script yang aku tandai merah itu semuanya kayak gitu.

ini aku hosting-in
Setelah kita hosting, maka kita akan mempunyai link yang menuju ke API tersebut. link tersebutlah yang nantinya digunakan pada script saat pembangunan aplikasi android-nya.


  1. API read_mhs : http://api.vhiefa.net76.net/simple_crud/read_mhs.php
  2. API create_mhs : http://api.vhiefa.net76.net/simple_crud/create_mhs.php
  3. API update_mhs : http://api.vhiefa.net76.net/simple_crud/update_mhs.php
  4. API delete_mhs : http://api.vhiefa.net76.net/simple_crud/delete_mhs.php

Langkah 3

Nah.. Sekarang kita lanjut ke bagian utama-ya, yaitu ngoding di android studio. Bentar! Aku bernapas dulu. Capek matanya -_-

Oke.. udah, ayo lanjut.

Kita create new project di android studio.






Langkah 4

Buka activity_main.xml, di situlah kita akan membuat tampilan awal aplikasi kita. Idenya, kita akan membuat sebuah daftar (list) mahasiswa di sini. Jadi masukan script berikut :

 <ListView
        android:id="@+id/listview_mhs"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
Sehingga, nantinya isi activity_main.xml adalah sebagai berikut :

<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" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <ListView
        android:id="@+id/listview_mhs"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

Langkah 5

Kita buat list_item_mhs.xml sebagai tampilan untuk tiap item daftar (list) mahasiswa. Berikut isinya :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:padding="10dp"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/id_mhs"
        android:visibility="gone"/> <!--untuk membuat textview tidak tampil-->

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/nama_mhs" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/nim_mhs"
        android:visibility="gone"/> <!--untuk membuat textview tidak tampil-->

</LinearLayout>

Terdiri dari 3 TextView yaitu untuk id_mhs, nama_mhs, dan nim_mhs, tapi yang id_mhs dan nim_mhs kita sembunyikan karena kita mau yang ditampilkan di list cuma nama mahasiswa saja.

Langkah 6

Sekarang kita lanjut ngoding java-nya. Sebelum kita ngotak-atik MainActivity.Java, kita buat dulu beberapa kelas yaitu Mahasiswa.java, MahasiswaAdapter.java, dan JSONParser.java

Mahasiswa.java berisi getter dan setter mahasiswa, kelas ini merupakan kelas entitas (halah.. sok PBO banget). Berikut kodingnya :



package com.vhiefa.simplecrud;

/**
 * Created by Afifatul on 6/18/2015.
 */
public class Mahasiswa {

    private String id_mhs;
    private String nama_mhs;
    private String nim_mhs;

    public void setMhsId (String id_mhs)
    {
        this.id_mhs = id_mhs;
    }

    public String getMhsId()
    {
        return id_mhs;
    }

    public void setMhsName (String nama_mhs)
    {
        this.nama_mhs = nama_mhs;
    }

    public String getMhsName()
    {
        return nama_mhs;
    }

    public void setMhsNIM (String nim_mhs)
    {
        this.nim_mhs = nim_mhs;
    }

    public String getMhsNIM()
    {
        return nim_mhs;
    }
}



MahasiswaAdapter.java digunakan sebagai adapter yang mengatur tampilan setiap list item mahasiswa. Berikut kodingnya :



package com.vhiefa.simplecrud;

/**
 * Created by Afifatul on 6/18/2015.
 */

import java.util.ArrayList;
import java.util.HashMap;
import com.vhiefa.simplecrud.Mahasiswa;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MahasiswaAdapter extends BaseAdapter {
    private Activity activity;
    //private ArrayList<HashMap<String, String>> data;
    private ArrayList<Mahasiswa> data_mhs=new ArrayList<Mahasiswa>();

    private static LayoutInflater inflater = null;

    public MahasiswaAdapter(Activity a, ArrayList<Mahasiswa> d) {
        activity = a; data_mhs = d;
        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    public int getCount() {
        return data_mhs.size();
    }
    public Object getItem(int position) {
        return data_mhs.get(position);
    }
    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        if (convertView == null)
            vi = inflater.inflate(R.layout.list_item_mhs, null);
        TextView id_mhs = (TextView) vi.findViewById(R.id.id_mhs);
        TextView nama_mhs = (TextView) vi.findViewById(R.id.nama_mhs);
        TextView nim_mhs = (TextView) vi.findViewById(R.id.nim_mhs);

        Mahasiswa daftar_mhs = data_mhs.get(position);
        id_mhs.setText(daftar_mhs.getMhsId());
        nama_mhs.setText(daftar_mhs.getMhsName());
        nim_mhs.setText(daftar_mhs.getMhsNIM());

        return vi;
    }
}


JSONParser.java merupakan kelas yang mem-parsing data JSON dari API ke aplikasi android atau sebaliknya. Ada dua method di sini yaitu POST dan GET, tapi kalo aku make POST. Berikut kodingnya :



package com.vhiefa.simplecrud;

/**
 * Created by Afifatul on 6/18/2015.
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.SocketException;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
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.client.utils.URLEncodedUtils;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;

public class JSONParser {
    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";


    int timeout=10000; //in milisecond = 10 detik

    // constructor
    public JSONParser() {
        //timeout = new Values().gettimeout();
    }

    // function get json from url
    // by making HTTP POST or GET mehtod
    public JSONObject makeHttpRequest(String url, String method,
                                      List<NameValuePair> params) {

        // Making HTTP request
        try {

            HttpParams httpParameters = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParameters, timeout);
            HttpConnectionParams.setSoTimeout(httpParameters, timeout);

            // check for request method
            if(method == "POST"){
                // request method is POST
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            }else if(method == "GET"){
                // request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (SocketException ste)
        {
            Log.e("Timeout Exception: ", ste.toString());
        }
        catch (ConnectTimeoutException e)
        {
            Log.e("Timeout Exception: ", e.toString());
        }
        catch (IOException e) {
            e.printStackTrace();
        }



        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }
}

Langkah 7

Nah.. sekarang kita ngoding buat MainActivity.Java, kelas ini kita extends sebagai ActionBarActivity, kelas ini juga digunakan sebagai kelas boundary yang menampilkan activity_main.xml, sehingga kodingnya sebagai berikut :


package com.vhiefa.simplecrud;

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
    }
}



Sebagaimana kita ketahui di activity_main.xml kan ada listView, sekarang kita definisikan listView tersebut , sehingga kodingnya menjadi sebagai berikut :

package com.vhiefa.simplecrud;

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {
    ListView list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        list = (ListView) findViewById(R.id.listview_mhs);
    }
}


Selanjutnya kita buat kelas AsyncTask yang digunakan untuk membaca data mahasiswa dari data JSON API read_mhs. Kelas ini taruh saja di dalam kelas MainActivity. Tapi sebelumnya definisikan dulu beberapa global atribut berikut :

    JSONParser jParser = new JSONParser();
    ArrayList<Mahasiswa> daftar_mhs = new ArrayList<Mahasiswa>();
    JSONArray daftarMhs = null;
    String url_read_mhs = "http://api.vhiefa.net76.net/simple_crud/read_mhs.php";
    // JSON Node names, ini harus sesuai yang di API
    public static final String TAG_SUCCESS = "success";
    public static final String TAG_MHS = "mahasiswa";
    public static final String TAG_ID_MHS = "id_mhs";
    public static final String TAG_NAMA_MHS = "nama";
    public static final String TAG_NIM_MHS = "nim";

kelas AsyncTask tersebut kita beri nama ReadMshTask, ini kodingnya :

class ReadMhsTask extends AsyncTask<String, Void, String>
    {
        ProgressDialog pDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Mohon Tunggu..");
            pDialog.setIndeterminate(true);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @Override
        protected String doInBackground(String... sText) {
            String returnResult = getMhsList(); //memanggil method getMhsList()
            return returnResult;

        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            pDialog.dismiss();
            if(result.equalsIgnoreCase("Exception Caught"))
            {
                Toast.makeText(MainActivity.this, "Unable to connect to server,please check your internet connection!", Toast.LENGTH_LONG).show();
            }

            if(result.equalsIgnoreCase("no results"))
            {
                Toast.makeText(MainActivity.this, "Data empty", Toast.LENGTH_LONG).show();
            }
            else
            {
                list.setAdapter(new MahasiswaAdapter(MainActivity.this,daftar_mhs)); //Adapter menampilkan data mahasiswa ke dalam listView
            }
        }


        //method untuk memperoleh daftar mahasiswa dari JSON
        public String getMhsList()
        {
            Mahasiswa tempMhs = new Mahasiswa();
            List<NameValuePair> parameter = new ArrayList<NameValuePair>();
            try {
                JSONObject json = jParser.makeHttpRequest(url_read_mhs,"POST", parameter);

                int success = json.getInt(TAG_SUCCESS);
                if (success == 1) { //Ada record Data (SUCCESS = 1)
                    //Getting Array of daftar_mhs
                    daftarMhs = json.getJSONArray(TAG_MHS);
                    // looping through All daftar_mhs
                    for (int i = 0; i < daftarMhs.length() ; i++){
                        JSONObject c = daftarMhs.getJSONObject(i);
                        tempMhs = new Mahasiswa();
                        tempMhs.setMhsId(c.getString(TAG_ID_MHS));
                        tempMhs.setMhsName(c.getString(TAG_NAMA_MHS));
                        tempMhs.setMhsNIM(c.getString(TAG_NIM_MHS));
                        daftar_mhs.add(tempMhs);
                    }
                    return "OK";
                }
                else {
                    //Tidak Ada Record Data (SUCCESS = 0)
                    return "no results";
                }

            } catch (Exception e) {
                e.printStackTrace();
                return "Exception Caught";
            }
        }

    }

Secara keseluruhan, berikut isi MainActivity.java

package com.vhiefa.simplecrud;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import org.apache.http.NameValuePair;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;


public class MainActivity extends ActionBarActivity {

    ListView list;

    JSONParser jParser = new JSONParser();
    ArrayList<Mahasiswa> daftar_mhs = new ArrayList<Mahasiswa>();
    JSONArray daftarMhs = null;
    String url_read_mhs = "http://api.vhiefa.net76.net/simple_crud/read_mhs.php";
    // JSON Node names, ini harus sesuai yang di API
    public static final String TAG_SUCCESS = "success";
    public static final String TAG_MHS = "mahasiswa";
    public static final String TAG_ID_MHS = "id_mhs";
    public static final String TAG_NAMA_MHS = "nama";
    public static final String TAG_NIM_MHS = "nim";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        list = (ListView) findViewById(R.id.listview_mhs);

        //jalankan ReadMhsTask
        ReadMhsTask m= (ReadMhsTask) new ReadMhsTask().execute();

    }


    class ReadMhsTask extends AsyncTask<String, Void, String>
    {
        ProgressDialog pDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Mohon Tunggu..");
            pDialog.setIndeterminate(true);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @Override
        protected String doInBackground(String... sText) {
            String returnResult = getMhsList(); //memanggil method getMhsList()
            return returnResult;

        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            pDialog.dismiss();
            if(result.equalsIgnoreCase("Exception Caught"))
            {
                Toast.makeText(MainActivity.this, "Unable to connect to server,please check your internet connection!", Toast.LENGTH_LONG).show();
            }

            if(result.equalsIgnoreCase("no results"))
            {
                Toast.makeText(MainActivity.this, "Data empty", Toast.LENGTH_LONG).show();
            }
            else
            {
                list.setAdapter(new MahasiswaAdapter(MainActivity.this,daftar_mhs)); //Adapter menampilkan data mahasiswa ke dalam listView
            }
        }


        //method untuk memperoleh daftar mahasiswa dari JSON
        public String getMhsList()
        {
            Mahasiswa tempMhs = new Mahasiswa();
            List<NameValuePair> parameter = new ArrayList<NameValuePair>();
            try {
                JSONObject json = jParser.makeHttpRequest(url_read_mhs,"POST", parameter);

                int success = json.getInt(TAG_SUCCESS);
                if (success == 1) { //Ada record Data (SUCCESS = 1)
                    //Getting Array of daftar_mhs
                    daftarMhs = json.getJSONArray(TAG_MHS);
                    // looping through All daftar_mhs
                    for (int i = 0; i < daftarMhs.length() ; i++){
                        JSONObject c = daftarMhs.getJSONObject(i);
                        tempMhs = new Mahasiswa();
                        tempMhs.setMhsId(c.getString(TAG_ID_MHS));
                        tempMhs.setMhsName(c.getString(TAG_NAMA_MHS));
                        tempMhs.setMhsNIM(c.getString(TAG_NIM_MHS));
                        daftar_mhs.add(tempMhs);
                    }
                    return "OK";
                }
                else {
                    //Tidak Ada Record Data (SUCCESS = 0)
                    return "no results";
                }

            } catch (Exception e) {
                e.printStackTrace();
                return "Exception Caught";
            }
        }

    }
}



Langkah 8

Kita update dulu AndroidMainfest.xml, kita masukan permission agar aplikasi android kita boleh mengakses internet.


<uses-permission android:name="android.permission.INTERNET" />

Sekarang isi AndroidManifest menjadi sebagai berikut :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.vhiefa.simplecrud" >

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


Selesai!! Sekarang kita bisa mencoba menjalankan aplikasi kita, dan bisa dilihat bahwa aplikasi kita bisa membaca data mahasiswa dari database.

Untuk tutorial yang mengupdate, men-delete, dan meng-create, silahkan baca di TUTORIAL MEMBUAT APLIKASI CRUD (CREATE, READ, UPDATE, DELETE) SEDERHANA DI ANDROID DENGAN DATABASE DI SERVER (PART 2)


**Update :
Punyaku pake SDK yang lama. Misal kalian pake SDK versi 23an biasanya library org.apache belum ke-import, jadinya semua yang menyangkut Http request bakal merah semua.

Cara memperbaikinya adalah buka file gradle (Module:App) lalu tambahkan satu baris berikut :

useLibrary 'org.apache.http.legacy'

62 comments:

  1. Mbak, mau tanya...
    sudah saya coba tutoriaLnya, namun tdk bs connect internet,
    masaLahnya dmna yaaa?

    "Unable to connect to server,please check your internet connection!"

    ReplyDelete
  2. Permissionnya jg ud dkasih juga, kira2 dmn yaa saLahnya?

    ReplyDelete
    Replies
    1. +Dawam Pribadi : berarti ada exception yang tertangkap. Coba lihat kesalahannya di log cat.
      Atau kirimkan screenshot erorr pada log cat ke saya. :) Nanti saya coba bantu.

      Delete
  3. Cara parsing json bisa gak selain pake .java? Kayak pakai .php gitu , nah itu ditaruh di server hosting, terus androidnya tinggal ambil deh data json dari php tadi... Kira2 bisa gak seperti itu master?? Cuman ide sih...haha

    ReplyDelete
    Replies
    1. maksud kamu data yang sudah direpresentasikan dalam bentuk json pake php, terus mau diparsing ke android pake php lagi?

      Kayaknya ga bisa deh, rahmatdi :)

      Soalnya android sendiri kalo mau ngambil data dari php (connect ke cloud), memang harus ngeparsing (nge-ambil) data json agar bisa doubah ke jsonObject. Kalau kamu bilang jsonparser-nya di server, terus android tinggal ngambil.. lha buat ngambilnya itu juga dia harus punya parser lagi -_-

      Hehe. itu menurutku sih. CMIIW :D

      Delete
  4. Mau tanya mbk..

    Kok tidak bisa connect ke internet ya?
    "Unable to connect to server,please check your internet connection!"

    Kenapa y?

    ReplyDelete
    Replies
    1. Pesan itu muncul kalo ada exception tertangkap (perhatikan method getMhsList di kelas MainActivity).

      Jadi kemungkinan ada kesalahan di dalam try { .... }, kesalahan saat memparsing data. Bisa jadi karena internet yang bermasalah (internet ga ada, atau internet permission belum di kasih) atau pada data json-nya yang bermasalah (ga bisa kebaca, formatnya berbeda, dll), atau kelas jsonParser yang bermasalah..

      Jadi banyak kemungkinan kesalahan. Saya ga bisa memberi solusi kalau tidak melihat log cat-nya. Hanya melalui log cat kita bisa tau kesalahannya dimana.

      Mungkin log cat-nya bisa di-screenshot lalu email ke saya. :)

      Delete
    2. emailnya sampean apa mbk?hehe

      Delete
  5. Mantaaap gan!!
    Membantu sekali tutorialnya. :)

    ReplyDelete
  6. Tolong Mbak saya Stuck Di JSONParser.java, errornya sebagai berikut :

    Error:(38, 39) error: cannot find symbol class List
    Error:(38, 44) error: cannot find symbol class NameValuePair
    Error:(43, 45) error: cannot find symbol class BasicHttpParams
    Error:(51, 17) error: cannot find symbol class DefaultHttpClient
    Error:(51, 52) error: cannot find symbol class DefaultHttpClient
    Error:(52, 17) error: cannot find symbol class HttpPost
    Error:(52, 41) error: cannot find symbol class HttpPost
    Error:(53, 40) error: cannot find symbol class UrlEncodedFormEntity
    Error:(55, 17) error: cannot find symbol class HttpResponse
    Error:(56, 17) error: cannot find symbol class HttpEntity
    Error:(61, 17) error: cannot find symbol class DefaultHttpClient
    Error:(61, 52) error: cannot find symbol class DefaultHttpClient
    Error:(62, 38) error: cannot find symbol variable URLEncodedUtils
    Error:(64, 17) error: cannot find symbol class HttpGet
    Error:(64, 39) error: cannot find symbol class HttpGet
    Error:(66, 17) error: cannot find symbol class HttpResponse
    Error:(67, 17) error: cannot find symbol class HttpEntity
    Error:(73, 18) error: cannot find symbol class ClientProtocolException

    gimana mbak?

    ReplyDelete
    Replies
    1. iya saya juga nih, sebelum di build udah merah banyak banget. kayaknya untuk android studio terbaru (saya pakai 1.5.x) kalau saya baca-baca, udah gak disupport lagi mbak.
      bingung deh mentok mulu nih baca tutorial yang berkaitan dengan CRUD :(

      Delete
    2. maksudnya class-nya udah gak disupport, tapi bingung harus ganti kemana dan bagaimana caranya :(

      Delete
    3. Betul kata asakura.. Tambahin itu..

      Punyaku pake sdk lama, jadi masih bisa. Kalo kalian sdk-nya versi 23an ditambah itu di gradle module:app-nya.

      Delete
    4. Betul kata asakura.. Tambahin itu..

      Punyaku pake sdk lama, jadi masih bisa. Kalo kalian sdk-nya versi 23an ditambah itu di gradle module:app-nya.

      Delete
  7. udah aku kementar ya fa, jagan paksa2 lagi :P

    ReplyDelete
  8. kalau untuk api login nya gimana ya ?
    saya buat seperti ini
    0) {

    $result = mysql_fetch_array($result);

    $pendaftaran = array();
    $pendaftaran["nim"] = $result["nim"];
    $pendaftaran["name"] = $result["name"];
    $pendaftaran["email"] = $result["email"];
    $pendaftaran["password"] = $result["password"];
    // maka
    $response["success"] = 1;

    // node
    $response["pendaftaran"] = array();

    array_push($response["pendaftaran"], $pendaftaran);

    // echoing JSON response
    echo json_encode($response);
    } else {
    // jika kosong
    $response["success"] = 0;
    $response["message"] = "Tidak ada data";

    // echo no users JSON
    echo json_encode($response);
    }
    } else {
    $response["success"] = 0;
    $response["message"] = "Tidak ada data";

    echo json_encode($response);
    }
    } else {
    $response["success"] = 0;
    $response["message"] = "Silahkan lengkapi permintaan anda";

    echo json_encode($response);
    }
    ?>

    tapi force close.. saya pakai buat metode nya gak jauh beda dengan pendaftarannya, kan kalau di java nya, hanya perlu mereturn kan nilai nim,password ke php nya kan ?
    tolong bantuan nya ya mbak :) hehe
    mohon email ke fernan.situmorang99@gmail.com

    ReplyDelete
  9. makasih kak afifah :D,sughooii sekali

    ReplyDelete
  10. Mbak , minta tolong donk , ini kan buat Api 21 ke bawah , kalau msal pngn buat aplikasi Crud API 22+ itu gmana ya ? soalnya kalau coding ini saya pakai , httpClientnya tidak bisa kebaca di API 22+ ...

    tq

    ReplyDelete
    Replies
    1. tambahin ini kalo masih ma pake Http request...

      useLibrary 'org.apache.http.legacy'

      di gradle nya, Module:app

      Delete
  11. mbak fiefa sharing yg buat searching datanya dong...hehe

    ReplyDelete
  12. MBAK LONTOONGG

    import android.app.ProgressDialog;
    import android.content.Intent;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.support.v7.app.ActionBarActivity;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;
    import org.apache.http.NameValuePair;
    import org.json.JSONArray;
    import org.json.JSONObject;
    import java.util.ArrayList;
    import java.util.List;


    public class MainActivity extends ActionBarActivity {


    itu action bar nya pada merah (error)

    ReplyDelete
    Replies
    1. pas di run muncul kaya gini



      Error:(14, 9) Missing 'name' key attribute on element activity at AndroidManifest.xml:14:9
      Error:Execution failed for task ':app:processDebugManifest'.
      > Manifest merger failed with multiple errors, see logs
      Information:BUILD FAILED
      Information:2 errors
      Information:Total time: 1 mins 38.343 secs
      Information:0 warnings
      Information:See complete output in console

      Delete
  13. mbak, saya masih newbie mau tanya kalau database servernya itu yang mana yaa?

    ReplyDelete
  14. Setelah saya coba..
    dipostingan agan pakai mysql tapi tidak bisa disitu pasti masalahnya "Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead "

    saya coba pakai mysqli dan berhasil
    jadi mysql semua diganti menjadi mysqli baru bisa

    terima kasih gan tutorial nya

    ReplyDelete
  15. Terimakasih gan, sangat membantu. Ada pin BB/Wa gan? kalau boleh mau tanya2 lagi. Trims

    ReplyDelete
  16. saya coba tapi muncul begini terus mas "Unable to connect to server,please check your internet connection!"
    bisa bantu saya???
    itu kenapa?

    ReplyDelete
    Replies
    1. Itu bisa jadi karena yang di server yang bermasalah. coba dicek di web browser langsung API-nya keluar jsonnya apa ga.

      Delete
  17. trims tutornya pas banget buat praktek tugas saya.. :)

    kunjungi juga aplikasipbbonline.wordpress.com
    kami menjual aplikasi sistem informasi PBB Online:

    - SIMPBB (Sistem Informasi Manajemen Pajak Bumi dan Bangunan)
    - SIBPHTB (Sistem Informasi Bea Perolehan Hak Tanah dan Banguan)
    - SIG (Sistem Informasi Geografis)

    Informasi lebih lanjut hubungi www.aplikasipemda.com
    brahmanto@cendana2000.co.id Telp. 089691540880

    ReplyDelete
  18. mbak mau tanya ini mbak e work make xampp versi berapa ya?

    ReplyDelete
    Replies
    1. aku lupa versi berapa. haha.. kodingnya udah pada ilang. laptop lama juga udah dipensiunkan. maaf gan.

      Delete
  19. untuk perintah require_once '../simple_crud/db_config.php';
    itu titik2 nya diganti apa ya?

    jika saya membuat lokasi yang sama dengan hosting anda apakah tidak usah diganti atau gmn?

    ReplyDelete
    Replies
    1. titik2 ga usah diganti biarkan kayak gitu gan. itu maksudnya folder2 sebelum itu.

      Delete
  20. kalo pake radio button gimana ya? kaya ada jenis kelamin laki2 dan perempuan

    ReplyDelete
    Replies
    1. tinggal get value dari masing2 radio button gan. valuenya disimpan dalam variabel terus nanti dilempar ke server.

      Delete
  21. class ReadMhsTask extends AsyncTask
    {
    ProgressDialog pDialog;

    @Override
    protected void onPreExecute() {
    super.onPreExecute();
    pDialog = new ProgressDialog(MainActivity.this);
    pDialog.setMessage("Mohon Tunggu..");
    pDialog.setIndeterminate(true);
    pDialog.setCancelable(true);
    pDialog.show();
    }

    @Override
    protected String doInBackground(String... sText) {
    String returnResult = getMhsList(); //memanggil method getMhsList()
    return returnResult;

    }

    @Override
    protected void onPostExecute(String result) {
    super.onPostExecute(result);
    pDialog.dismiss();
    if(result.equalsIgnoreCase("Exception Caught"))
    {
    Toast.makeText(MainActivity.this, "Unable to connect to server,please check your internet connection!", Toast.LENGTH_LONG).show();
    }

    if(result.equalsIgnoreCase("no results"))
    {
    Toast.makeText(MainActivity.this, "Data empty", Toast.LENGTH_LONG).show();
    }
    else
    {
    list.setAdapter(new MahasiswaAdapter(MainActivity.this,daftar_mhs)); //Adapter menampilkan data mahasiswa ke dalam listView
    }
    }


    //method untuk memperoleh daftar mahasiswa dari JSON
    public String getMhsList()
    {
    Mahasiswa tempMhs = new Mahasiswa();
    List parameter = new ArrayList();
    try {
    JSONObject json = jParser.makeHttpRequest(url_read_mhs,"POST", parameter);

    int success = json.getInt(TAG_SUCCESS);
    if (success == 1) { //Ada record Data (SUCCESS = 1)
    //Getting Array of daftar_mhs
    daftarMhs = json.getJSONArray(TAG_MHS);
    // looping through All daftar_mhs
    for (int i = 0; i < daftarMhs.length() ; i++){
    JSONObject c = daftarMhs.getJSONObject(i);
    tempMhs = new Mahasiswa();
    tempMhs.setMhsId(c.getString(TAG_ID_MHS));
    tempMhs.setMhsName(c.getString(TAG_NAMA_MHS));
    tempMhs.setMhsNIM(c.getString(TAG_NIM_MHS));
    daftar_mhs.add(tempMhs);
    }
    return "OK";
    }
    else {
    //Tidak Ada Record Data (SUCCESS = 0)
    return "no results";
    }

    } catch (Exception e) {
    e.printStackTrace();
    return "Exception Caught";
    }
    }

    }

    mba disini error kenapa ya???

    ReplyDelete
  22. Terimakasih, artikel yang sangat lengkap dengan pemaparan dan respon yang baik

    ReplyDelete
  23. String url_read_mhs = "http://api.vhiefa.net76.net/simple_crud/read_mhs.php";

    masih bingung ni
    yang in api.vhiefa.net76.net dari mana
    apakah dari www.000webhost.com/
    https://www.000webhost.com/members/website/haruhardadi/database

    ReplyDelete
  24. Hallo vhiefa.
    Saya pengembang android menggunakan android studio saya kurang mengerti tentang php.
    Bisa tolong berikan contoh untuk mengisi user Db, namedb, passdb, dan serverdb pada db_config.php dengan 000webhost.
    Dan saya mengalami error pada read_mhs.

    ReplyDelete
  25. Haii kak, terimakasih atas ilmunya kak, tulisan kakak sangat bermanfaat untuk saya. Semangat terus kak, saya tunggu tulisan kakak yg berikutnya. perkenalkan nama saya Ranum fatwa aulia, NIM 1922500033, dan jangan lupa untuk kunjungi website kampus saya di https://www.atmaluhur.ac.id/

    ReplyDelete
  26. Halo kak, terimakasih artikelnya... ini sangat membantu saya dalam menyelesaikan tugas kuliah saya. oh ya kak, perkenalkan nama saya Nurhamimah dan jangan lupa kunjungi website kampus saya ISB Atma Luhur

    ReplyDelete
  27. Halo kak, terimakasih artikelnya... ini sangat membantu saya dalam menyelesaikan tugas kuliah saya. oh ya kak, perkenalkan nama saya Nurhamimah dan jangan lupa kunjungi website kampus saya ISB Atma Luhur

    ReplyDelete

Powered by Blogger.