Aku menulis apa yang ingin aku tulis, bukan yang ingin kamu baca.

Friday, June 19, 2015

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




Langkah 9

Sekarang kita lanjut untuk membuat kelas yang digunakan untuk mengupdate dan men-delete data mahasiswa. Idenya adalah ketika sebuah item mahasiswa dari list mahasiswa di-klik maka akan menuju activity untuk update/delete.

Kita buat dulu activity_updatedelete.xml, berikut isinya :

<?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: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="match_parent"
        android:layout_height="wrap_content"
        android:text="Nama"
        android:id="@+id/textView" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextNama" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="NIM"
        android:id="@+id/textView2"
        android:layout_gravity="center_horizontal" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextNim"
        android:layout_gravity="center_horizontal" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_weight="1"
        >

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Update"
            android:layout_weight="0.5"
            android:id="@+id/buttonUpdate"/>

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Delete"
            android:layout_weight="0.5"
            android:id="@+id/buttonDelete" />
    </LinearLayout>
</LinearLayout>

Selanjutnya, kita buat kelas boundary-nya yaitu UpdateDeleteActivity.java, kelas ini dibuat extends ActionBarActivity, dan jangan lupa kita definisikan juga setiap TextView, Button, maupun EditText-nya. Berikut kodingnya :

package com.vhiefa.simplecrud;

import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

/**
 * Created by Afifatul on 6/18/2015.
 */
public class UpdateDeleteActivity extends ActionBarActivity {

    EditText EditTxtnama, EditTxtnim;
    TextView TxtViewId;
    Button UpdateBtn, DeleteBtn;


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

        EditTxtnama = (EditText) findViewById(R.id.editTextNama);
        EditTxtnim = (EditText) findViewById(R.id.editTextNim);
        TxtViewId = (TextView) findViewById(R.id.id_mhs);

        UpdateBtn = (Button) findViewById(R.id.buttonUpdate);
        DeleteBtn = (Button) findViewById(R.id.buttonDelete);

    }


}


Kita update AndroidManifest.xml agar kelas UpdateDeleteActivity bisa dipanggil di aplikasi android kita, tambahkan code berikut :

        <activity
            android:name="com.vhiefa.simplecrud.UpdateDeleteActivity"
            android:label="Detail Mahasiswa"
            android:parentActivityName="com.vhiefa.simplecrud.MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.vhiefa.simplecrud.MainActivity" />
        </activity>

Sehingga koding di AndroidManifest.xml secara keseluruhan 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>
        <activity
            android:name="com.vhiefa.simplecrud.UpdateDeleteActivity"
            android:label="Detail Mahasiswa"
            android:parentActivityName="com.vhiefa.simplecrud.MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.vhiefa.simplecrud.MainActivity" />
        </activity>
    </application>

</manifest>


Langkah 10

Kita update lagi koding di MainActivity.java, karena kita akan membuat agar list item mahasiswa ketika di-klik bisa menuju activity update/delete. Kita juga akan membuat id,nama, dan nim mahasiswa ter-parsing ke kelas UpdateDeleteActivity. Tambahkan koding berikut di dalam method onCreate :

        list.setOnItemClickListener(new AdapterView.OnItemClickListener(){
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int urutan, long id) {
                //dapatkan data id, nama, nim mahasiswa dan simpan dalam variable string
                String idmhs = ((TextView) view.findViewById(R.id.id_mhs)).getText().toString();
                String nama = ((TextView) view.findViewById(R.id.nama_mhs)).getText().toString();
                String nim = ((TextView) view.findViewById(R.id.nim_mhs)).getText().toString();

                //varible string tadi kita simpan dalam suatu Bundle, dan kita parse bundle tersebut bersama intent menuju kelas UpdateDeleteActivity
                Intent i = null;
                i = new Intent(MainActivity.this, UpdateDeleteActivity.class);
                Bundle b = new Bundle();
                b.putString("id_mhs", idmhs);
                b.putString("nama_mhs", nama);
                b.putString("nim_mhs", nim);
                i.putExtras(b);
                startActivity(i);
            }
        });

Sehingga seluruh koding di MainActivity.java menjadi :

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();

        list.setOnItemClickListener(new AdapterView.OnItemClickListener(){
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int urutan, long id) {
                //dapatkan data id, nama, nim mahasiswa dan simpan dalam variable string
                String idmhs = ((TextView) view.findViewById(R.id.id_mhs)).getText().toString();
                String nama = ((TextView) view.findViewById(R.id.nama_mhs)).getText().toString();
                String nim = ((TextView) view.findViewById(R.id.nim_mhs)).getText().toString();

                //varible string tadi kita simpan dalam suatu Bundle, dan kita parse bundle tersebut bersama intent menuju kelas UpdateDeleteActivity
                Intent i = null;
                i = new Intent(MainActivity.this, UpdateDeleteActivity.class);
                Bundle b = new Bundle();
                b.putString("id_mhs", idmhs);
                b.putString("nama_mhs", nama);
                b.putString("nim_mhs", nim);
                i.putExtras(b);
                startActivity(i);
            }
        });
    }


    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 11

Selanjutnya kita buka lagi UpdateDeleteActivity.java dan kita masukan kode yang menangkap bundle yang telah di-parsing dari kelas MainActivity tadi. Masukan code berikut :

        //menangkap bundle yang telah di-parsed dari MainActivity
        Bundle b = getIntent().getExtras();
        String isi_id_mhs = b.getString("id_mhs");
        String isi_nama_mhs= b.getString("nama_mhs");
        String isi_nim_mhs= b.getString("nim_mhs");
        //meng-set bundle tersebut
        EditTxtnama.setText(isi_nama_mhs);
        EditTxtnim.setText(isi_nim_mhs);
        TxtViewId.setText(isi_id_mhs);
Langkah 12

Kita buat AsyncTask di UpdateDeleteActivity untuk update data mahasiswa, kita beri nama UpdateMhsTask. Berikut kodingnya :

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

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

        @Override
        protected String doInBackground(String... sText) {

            List<NameValuePair> parameter = new ArrayList<NameValuePair>();
            parameter.add(new BasicNameValuePair(TAG_ID_MHS, idStr));
            parameter.add(new BasicNameValuePair(TAG_NAMA_MHS, namaStr));
            parameter.add(new BasicNameValuePair(TAG_NIM_MHS, nimStr));

            try {
                JSONObject json = jParser.makeHttpRequest(url_update_mhs,"POST", parameter);

                int success = json.getInt(TAG_SUCCESS);
                if (success == 1) {

                    return "OK";
                }
                else {

                    return "FAIL";

                }

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

        }

        @Override
        protected void onPostExecute(String result) {

            super.onPostExecute(result);
            pDialog.dismiss();

            if(result.equalsIgnoreCase("Exception Caught"))
            {

                Toast.makeText(UpdateDeleteActivity.this, "Unable to connect to server,please check your internet connection!", Toast.LENGTH_LONG).show();
            }

            if(result.equalsIgnoreCase("FAIL"))
            {
                Toast.makeText(UpdateDeleteActivity.this, "Fail.. Try Again", Toast.LENGTH_LONG).show();
            }

            else {
                Intent i = null;
                i = new Intent(UpdateDeleteActivity.this, MainActivity.class);
                startActivity(i);
            }

        }
    }
Langkah 13 

Kita buat AsyncTask di UpdateDeleteActivity untuk delete data mahasiswa, kita beri nama DeleteMhsTask. Berikut kodingnya :

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

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

        @Override
        protected String doInBackground(String... sText) {

            List<NameValuePair> parameter = new ArrayList<NameValuePair>();
            parameter.add(new BasicNameValuePair(TAG_ID_MHS, idStr));

            try {
                JSONObject json = jParser.makeHttpRequest(url_delete_mhs,"POST", parameter);

                int success = json.getInt(TAG_SUCCESS);
                if (success == 1) {

                    return "OK";
                }
                else {

                    return "FAIL";

                }

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

        }

        @Override
        protected void onPostExecute(String result) {

            super.onPostExecute(result);
            pDialog.dismiss();

            if(result.equalsIgnoreCase("Exception Caught"))
            {

                Toast.makeText(UpdateDeleteActivity.this, "Unable to connect to server,please check your internet connection!", Toast.LENGTH_LONG).show();
            }

            if(result.equalsIgnoreCase("FAIL"))
            {
                Toast.makeText(UpdateDeleteActivity.this, "Fail.. Try Again", Toast.LENGTH_LONG).show();
            }

            else {
                Intent i = null;
                i = new Intent(UpdateDeleteActivity.this, MainActivity.class);
                startActivity(i);
            }

        }
    }
Langkah 14

Kita buat agar button update dan button delete pada UpdateDeleteActivity bisa berfungsi sebagaimana mestinya. Tambahkan koding berikut :

        UpdateBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                idStr = TxtViewId.getText().toString();
                namaStr = EditTxtnama.getText().toString();
                nimStr = EditTxtnim.getText().toString();
                new UpdateMhsTask().execute();
            }
        });

        DeleteBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                idStr = TxtViewId.getText().toString();
                new DeleteMhsTask().execute();
            }
        });
Sehingga secara keseluruhan isi UpdateDeleteActivity.java adalah sebagai berikut :

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.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Afifatul on 6/18/2015.
 */
public class UpdateDeleteActivity extends ActionBarActivity {

    JSONParser jParser = new JSONParser();
    String url_update_mhs= "http://api.vhiefa.net76.net/simple_crud/update_mhs.php";
    String url_delete_mhs= "http://api.vhiefa.net76.net/simple_crud/delete_mhs.php";
    // JSON Node names, ini harus sesuai yang di API
    public static final String TAG_SUCCESS = "success";
    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";

    EditText EditTxtnama, EditTxtnim;
    TextView TxtViewId;
    Button UpdateBtn, DeleteBtn;
    String namaStr, nimStr, idStr;

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

        EditTxtnama = (EditText) findViewById(R.id.editTextNama);
        EditTxtnim = (EditText) findViewById(R.id.editTextNim);
        TxtViewId = (TextView) findViewById(R.id.id_mhs);

        UpdateBtn = (Button) findViewById(R.id.buttonUpdate);
        DeleteBtn = (Button) findViewById(R.id.buttonDelete);

        //menangkap bundle yang telah di-parsed dari MainActivity
        Bundle b = getIntent().getExtras();
        String isi_id_mhs = b.getString("id_mhs");
        String isi_nama_mhs= b.getString("nama_mhs");
        String isi_nim_mhs= b.getString("nim_mhs");
        //meng-set bundle tersebut
        EditTxtnama.setText(isi_nama_mhs);
        EditTxtnim.setText(isi_nim_mhs);
        TxtViewId.setText(isi_id_mhs);

        UpdateBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                idStr = TxtViewId.getText().toString();
                namaStr = EditTxtnama.getText().toString();
                nimStr = EditTxtnim.getText().toString();
                new UpdateMhsTask().execute();
            }
        });

        DeleteBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                idStr = TxtViewId.getText().toString();
                new DeleteMhsTask().execute();
            }
        });
    }

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

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

        @Override
        protected String doInBackground(String... sText) {

            List<NameValuePair> parameter = new ArrayList<NameValuePair>();
            parameter.add(new BasicNameValuePair(TAG_ID_MHS, idStr));
            parameter.add(new BasicNameValuePair(TAG_NAMA_MHS, namaStr));
            parameter.add(new BasicNameValuePair(TAG_NIM_MHS, nimStr));

            try {
                JSONObject json = jParser.makeHttpRequest(url_update_mhs,"POST", parameter);

                int success = json.getInt(TAG_SUCCESS);
                if (success == 1) {

                    return "OK";
                }
                else {

                    return "FAIL";

                }

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

        }

        @Override
        protected void onPostExecute(String result) {

            super.onPostExecute(result);
            pDialog.dismiss();

            if(result.equalsIgnoreCase("Exception Caught"))
            {

                Toast.makeText(UpdateDeleteActivity.this, "Unable to connect to server,please check your internet connection!", Toast.LENGTH_LONG).show();
            }

            if(result.equalsIgnoreCase("FAIL"))
            {
                Toast.makeText(UpdateDeleteActivity.this, "Fail.. Try Again", Toast.LENGTH_LONG).show();
            }

            else {
                Intent i = null;
                i = new Intent(UpdateDeleteActivity.this, MainActivity.class);
                startActivity(i);
            }

        }
    }


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

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

        @Override
        protected String doInBackground(String... sText) {

            List<NameValuePair> parameter = new ArrayList<NameValuePair>();
            parameter.add(new BasicNameValuePair(TAG_ID_MHS, idStr));

            try {
                JSONObject json = jParser.makeHttpRequest(url_delete_mhs,"POST", parameter);

                int success = json.getInt(TAG_SUCCESS);
                if (success == 1) {

                    return "OK";
                }
                else {

                    return "FAIL";

                }

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

        }

        @Override
        protected void onPostExecute(String result) {

            super.onPostExecute(result);
            pDialog.dismiss();

            if(result.equalsIgnoreCase("Exception Caught"))
            {

                Toast.makeText(UpdateDeleteActivity.this, "Unable to connect to server,please check your internet connection!", Toast.LENGTH_LONG).show();
            }

            if(result.equalsIgnoreCase("FAIL"))
            {
                Toast.makeText(UpdateDeleteActivity.this, "Fail.. Try Again", Toast.LENGTH_LONG).show();
            }

            else {
                Intent i = null;
                i = new Intent(UpdateDeleteActivity.this, MainActivity.class);
                startActivity(i);
            }

        }
    }
}


Selesai… Kita bisa jalankan aplikasi kita dan update dan delete juga bisa dilakukan.


Langkah 15

Sekarang kita lanjut agar aplikasi kita bisa menambah data mahasiswa ke database. Kita buat dulu activity_create.xml, berikut isinya :
<?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:padding="10dp"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Nama"
        android:id="@+id/textView" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextNama" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="NIM"
        android:id="@+id/textView2"
        android:layout_gravity="center_horizontal" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editTextNim"
        android:layout_gravity="center_horizontal" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add"
        android:id="@+id/buttonAdd"
        android:layout_gravity="center_horizontal" />
</LinearLayout>
Selanjutnya, kita buat kelas boundary-nya yaitu CreateActivity.java, kelas ini dibuat extends ActionBarActivity, dan jangan lupa kita definisikan juga setiap TextView, Button, maupun EditText-nya. Berikut kodingnya :

package com.vhiefa.simplecrud;

import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


/**
 * Created by Afifatul on 6/18/2015.
 */
public class CreateActivity extends ActionBarActivity{


    EditText EditTxtnama, EditTxtnim;
    Button addBtn;
    String namaStr, nimStr;

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

        EditTxtnama = (EditText) findViewById(R.id.editTextNama);
        EditTxtnim = (EditText) findViewById(R.id.editTextNim);
        addBtn = (Button) findViewById(R.id.buttonAdd);


    }

}
Kita update AndroidManifest.xml agar kelas CreateActivity bisa dipanggil di aplikasi android kita, tambahkan code berikut :

        <activity
            android:name="com.vhiefa.simplecrud.CreateActivity"
            android:label="Tambah Mahasiswa"
            android:parentActivityName="com.vhiefa.simplecrud.MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.vhiefa.simplecrud.MainActivity" />
        </activity>

Sehingga koding di AndroidManifest.xml secara keseluruhan 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>
        <activity
            android:name="com.vhiefa.simplecrud.CreateActivity"
            android:label="Tambah Mahasiswa"
            android:parentActivityName="com.vhiefa.simplecrud.MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.vhiefa.simplecrud.MainActivity" />
        </activity>
        <activity
            android:name="com.vhiefa.simplecrud.UpdateDeleteActivity"
            android:label="Detail Mahasiswa"
            android:parentActivityName="com.vhiefa.simplecrud.MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.vhiefa.simplecrud.MainActivity" />
        </activity>
    </application>

</manifest>

Langkah 16

Kita buat agar di activity utama (MainActivity) dapat menampilkan tombol Add di pojok kanan action bar. Caranya kita update dulu main_menu.xml yang berada pada direktori menu. Berikut kodingnya :
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">

    <item android:id="@+id/action_add" android:title="Add"
        android:orderInCategory="100" app:showAsAction="always" />
</menu>

Kemudian kita tambahkan kode berikut pada MainActivity.java
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();


        if (id == R.id.action_add) {
            Intent i = new Intent(MainActivity.this, CreateActivity.class);
            startActivity(i);
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
Sehingga secara keseluruhan isi MainActivity.java menjadi sebagai berikut :
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();

        list.setOnItemClickListener(new AdapterView.OnItemClickListener(){
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int urutan, long id) {
                //dapatkan data id, nama, nim mahasiswa dan simpan dalam variable string
                String idmhs = ((TextView) view.findViewById(R.id.id_mhs)).getText().toString();
                String nama = ((TextView) view.findViewById(R.id.nama_mhs)).getText().toString();
                String nim = ((TextView) view.findViewById(R.id.nim_mhs)).getText().toString();

                //varible string tadi kita simpan dalam suatu Bundle, dan kita parse bundle tersebut bersama intent menuju kelas UpdateDeleteActivity
                Intent i = null;
                i = new Intent(MainActivity.this, UpdateDeleteActivity.class);
                Bundle b = new Bundle();
                b.putString("id_mhs", idmhs);
                b.putString("nama_mhs", nama);
                b.putString("nim_mhs", nim);
                i.putExtras(b);
                startActivity(i);
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();


        if (id == R.id.action_add) {
            Intent i = new Intent(MainActivity.this, CreateActivity.class);
            startActivity(i);
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


    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 17

Sekarang kita buat AsyncTask di dalam CreateActivity.java untuk menambah data mahasiswa yang bernama CreateMhsTask, berikut kodingnya :

    class CreateMhsTask extends AsyncTask<String, String, String> {
        ProgressDialog dialog;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog = new ProgressDialog(CreateActivity.this);
            dialog.setMessage("Tambah Mahasiswa...");
            dialog.setIndeterminate(false);
            dialog.setCancelable(false);
            dialog.show();
        }

        protected String doInBackground(String... args) {

                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();

                params.add(new BasicNameValuePair(TAG_NAMA_MHS, namaStr));
                params.add(new BasicNameValuePair(TAG_NIM_MHS, nimStr));

                // getting JSON Object
                // Note that create Post url accepts POST method
                JSONObject json = jsonParser.makeHttpRequest(url_create_mhs, "POST", params);

                // check for success tag
                try {
                    int success = json.getInt(TAG_SUCCESS);

                    if (success == 1) {
                        // closing this screen
                        finish();
                    } else {
                        return "gagal_database";
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                    return "gagal_koneksi_or_exception";
                }

            return "sukses";

        }


        protected void onPostExecute(String result) {

            super.onPostExecute(result);
            if (result.equalsIgnoreCase("gagal_database")){
                dialog.dismiss();
                Toast.makeText(CreateActivity.this, "Terjadi masalah! Silahkan cek koneksi Anda!", Toast.LENGTH_SHORT).show();
            }
            else if (result.equalsIgnoreCase("gagal_koneksi_or_exception")){
                dialog.dismiss();
                Toast.makeText(CreateActivity.this, "Terjadi masalah! Silahkan cek koneksi Anda!",  Toast.LENGTH_SHORT).show();

            }
            else if (result.equalsIgnoreCase("sukses")){
                dialog.dismiss();
                Intent i = null;
                i = new Intent(CreateActivity.this, MainActivity.class);
                startActivity(i);
            }
        }
    }
Langkah 18

Kita buat agar ketika button add pada CreateActivity bisa berfungsi sebagaimana mestinya. Tambahkan kode berikut :
        addBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                namaStr = EditTxtnama.getText().toString();
                nimStr = EditTxtnim.getText().toString();
                new CreateMhsTask().execute();
            }
        });
Sehingga isi CreateActivity.java secara keseluruhan adalah sebagai berikut :
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.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Afifatul on 6/18/2015.
 */
public class CreateActivity extends ActionBarActivity{

    JSONParser jsonParser = new JSONParser();
    String url_create_mhs= "http://api.vhiefa.net76.net/simple_crud/create_mhs.php";
    // JSON Node names, ini harus sesuai yang di API
    public static final String TAG_SUCCESS = "success";
    public static final String TAG_NAMA_MHS = "nama";
    public static final String TAG_NIM_MHS = "nim";

    EditText EditTxtnama, EditTxtnim;
    Button addBtn;
    String namaStr, nimStr;

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

        EditTxtnama = (EditText) findViewById(R.id.editTextNama);
        EditTxtnim = (EditText) findViewById(R.id.editTextNim);
        addBtn = (Button) findViewById(R.id.buttonAdd);


        addBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                namaStr = EditTxtnama.getText().toString();
                nimStr = EditTxtnim.getText().toString();
                new CreateMhsTask().execute();
            }
        });
    }


    class CreateMhsTask extends AsyncTask<String, String, String> {
        ProgressDialog dialog;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog = new ProgressDialog(CreateActivity.this);
            dialog.setMessage("Tambah Mahasiswa...");
            dialog.setIndeterminate(false);
            dialog.setCancelable(false);
            dialog.show();
        }

        protected String doInBackground(String... args) {

                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();

                params.add(new BasicNameValuePair(TAG_NAMA_MHS, namaStr));
                params.add(new BasicNameValuePair(TAG_NIM_MHS, nimStr));

                // getting JSON Object
                // Note that create Post url accepts POST method
                JSONObject json = jsonParser.makeHttpRequest(url_create_mhs, "POST", params);

                // check for success tag
                try {
                    int success = json.getInt(TAG_SUCCESS);

                    if (success == 1) {
                        // closing this screen
                        finish();
                    } else {
                        return "gagal_database";
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                    return "gagal_koneksi_or_exception";
                }

            return "sukses";

        }


        protected void onPostExecute(String result) {

            super.onPostExecute(result);
            if (result.equalsIgnoreCase("gagal_database")){
                dialog.dismiss();
                Toast.makeText(CreateActivity.this, "Terjadi masalah! Silahkan cek koneksi Anda!", Toast.LENGTH_SHORT).show();
            }
            else if (result.equalsIgnoreCase("gagal_koneksi_or_exception")){
                dialog.dismiss();
                Toast.makeText(CreateActivity.this, "Terjadi masalah! Silahkan cek koneksi Anda!",  Toast.LENGTH_SHORT).show();

            }
            else if (result.equalsIgnoreCase("sukses")){
                dialog.dismiss();
                Intent i = null;
                i = new Intent(CreateActivity.this, MainActivity.class);
                startActivity(i);
            }
        }
    }
}

Selesai!!! Sekarang aplikasi kita bisa dijalankan. 

Code lengkap dan apk-nya bisa didownload  DI SINI

Sekian terimakasih.. I know that I am not that expert, but I just wanna share a little thing that I know. Correct me if I’m wrong. Cheers!

Kalo ada yang kurang jelas atau mau bertanya, langsung saja tinggalkan komentar :)
Read More

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'
Read More

Social Profiles

Twitter Facebook Google Plus LinkedIn RSS Feed Email Pinterest

My picture

I want to live my life to the absolute fullest, to open my eyes to be all i can be, to travel roads not taken, to meet faces unknown, to feel the wind, to touch the star
I promise to discover myself, to stand tall with greatness, to chase down and catch every dream
LIFE IS AN ADVENTURE

Popular Posts

Google+ Followers

Follow by Email

Total Pageviews

Instagram

Instagram

Follow Me

Copyright © Vhiefa | Powered by Blogger
Design by Lizard Themes | Blogger Theme by Lasantha - PremiumBloggerTemplates.com