Jumpa lagi dengan Agus Haryanto dalam seri Tutorial Android. Sebelumnya terimakasih kepada para pembaca yang sudah merekomendasikan blog ini sebagai salah satu blog favorit untuk tutorial android. Tutorial Kali ini akan membahas tentang Android PHP dan MySQL.
Android oh android kau membuatku semakin ingin memaksimalkan kemampuanmu. Ku bertanya dalam hati apakah engkau dapat mengakses database yang ada diserver, kalau bisa alangkah indahnya, mungkin seindah pergi kepulau komodo walaupun aku sendiri belum pernah kesana :), tetapi aku dapat merasakan keindahannya melalui gambar-gambar diinternet. Wah maaf jadi ngelanturnih.
Antara Jakarta dan Pulau Komodo terbentang jarak yang luas, kita harus melewati daratan dan menyeberangi lautan. Tapi tenang sekarang sudah ada Pesawat Terbang, kita bisa cepat tiba disana
Begitu juga dengan Handset android dengan database server terbentang jarak yang luas bergantung dari letak server kita. Untuk yang satu ini juga tidak perlu khawatir karena ada jaringan internet yang bisa menghubungkan handset android dengan database diserver.
Yang pernah bergaul dengan Aplikasi web database. Tentunya tidak asing dengan PHP dan MySQL.
Yang suka ngeblog tahukan wordpress. WordPress dibangun dengan menggunakan PHP dan MySQL.
Mungkin ada yang tidak sadar dengan Browser yang ada dilaptop kita dapat terhubung ke database MySQL yang tersimpan pada server yang jaraknya jauh dengan kita, semua itu dapat terwujud karena adanya jaringan Internet.
Laptop dengan Handset Android adalah sama, yaitu client dari suatu server, yang berarti dari handset android kita bisa mengakses file PHP yang ada diserver.
Oke untuk praktek kita kali ini kita akan membuat daftar harga menu makanan, yang datanya diinputkan dari aplikasi android dan ditampilkan juga diaplikasi android tersebut.
Langkah pertama adalah siapkan database beserta tablenya.
CREATE DATABASE db_makanan; CREATE TABLE tbl_makanan ( id INT(4) NOT NULL AUTO_INCREMENT, nama_makanan VARCHAR(32) NOT NULL, harga INT(10) NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM; insert into tbl_makanan values(null,'ayam bakar',12000); insert into tbl_makanan values(null,'ayam goreng',11000); insert into tbl_makanan values( null,'ikan bakar',12000);
Oke karena aplikasi android kita ini nantinya bisa memiliki fitur :
- Tambah data makanan
- Menampilkan data makanan yang telah diinputkan.
Untuk itu kita perlu membuat file PHP untuk menerima data dari android untuk dimasukkan ke dalam database, simpan dengan nama addmakanan.php
<?php $nama = $_GET['nama']; $harga = $_GET['harga']; $link = mysql_connect('localhost', 'user', 'password') or die('Cannot connect to the DB'); mysql_select_db('db_makanan', $link) or die('Cannot select the DB'); /* grab the posts from the db */ $query = "insert into tbl_makanan (nama_makanan,harga) values('".$nama."',".$harga.")"; $result = mysql_query($query, $link) or die('Error query: '.$query); echo "SUCCESS"; ?>
Buat juga file php untuk menampilkan daftar makanan yang telah kita inputkan, simpan dengan nama daftarmakanan.php
<?php $link = mysql_connect('localhost', 'user', 'password') or die('Cannot connect to the DB'); mysql_select_db('db_makanan', $link) or die('Cannot select the DB'); /* grab the posts from the db */ $query = "SELECT nama_makanan, harga FROM tbl_makanan"; $result = mysql_query($query, $link) or die('Errorquery: '.$query); $rows = array(); while ($r = mysql_fetch_assoc($result)) { $rows[] = $r; } $data = "{makanan:".json_encode($rows)."}"; echo $data; ?>
Dari file di atas dapat dilihat bahwa server akan mengirimkan data ke client dalam bentuk JSON.
Untuk membuktikannya, mari kita coba dibrowser, dengan memasukkan address
http://localhost/android/daftarmakanan.php
Sekarang android time
1. Buat Project Baru dengan nama AndroidJSON
2. Mari kita Buat layout untuk Tambah Data, simpan dengan nama tambah.xml
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:text="Nama Makanan :" android:id="@+id/TextView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> <EditText android:text="" android:id="@+id/txtNama" android:layout_width="fill_parent" android:layout_height="wrap_content"></EditText> <TextView android:text="Harga :" android:id="@+id/TextView02" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> <EditText android:text="" android:id="@+id/txtHarga" android:layout_width="fill_parent" android:layout_height="wrap_content"></EditText> <Button android:text="Simpan" android:id="@+id/btnSimpan" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button> </LinearLayout>
3.Buat juga Layout untuk menampilkan daftar harga makanan, simpan dengan nama daftarmakanan.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Baca Data Dari server dengan JSON" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Daftar Makanan" /> <TextView android:layout_width="fill_parent" android:id="@+id/TextViewResult" android:layout_height="wrap_content" android:text="Hasil JSON" /> </LinearLayout>
4. Sekararang Mari kita buat Menu dari aplikasi ini, yang didalamnya terdapat navigasi
untuk masuk ke Form Tambah,
ke Daftar Makanan dan keluar Aplikasi. Edit File MainActivity.java
package com.agus.android.php; /** * Class InsertActivity * @version 1.0 Dec 18, 2011 * @author Agus Haryanto (agus.superwriter@gmail.com) * @website http://agusharyanto.net */ import android.app.ListActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends ListActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); // Create an array of Strings, that will be put to our ListActivity String[] menu = new String[] { "Tambah Data", "Tampilkan Data", "Exit" }; // Create an ArrayAdapter, that will actually make the Strings above // appear in the ListView // Menset nilai array ke dalam list adapater sehingga data pada array // akan dimunculkan dalam list this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, menu)); } @Override /**method ini akan mengoveride method onListItemClick * yang ada pada class List Activity * method ini akan dipanggil apabilai ada salah satu item * dari list menu yang dipilih */ protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); // Get the item that was clicked Object o = this.getListAdapter().getItem(position); String pilihan = o.toString(); tampilkanPilihan(pilihan); } protected void tampilkanPilihan(String pilihan) { try { Intent i = null; if (pilihan.equals("Tambah Data")) { i = new Intent(this, InsertActivity.class); } else if (pilihan.equals("Tampilkan Data")) { i = new Intent(this, JSONActivity.class); } else if (pilihan.equals("Exit")) { finish(); } else { Toast.makeText(this,"Anda Memilih: " + pilihan + " , " + "Actionnya belum dibuat", Toast.LENGTH_LONG).show(); } startActivity(i); } catch (Exception e) { e.printStackTrace(); } } }
5. Sekarang Bagian Form Tambah Datanya, Buat Class baru dengan nama InsertActivity.java.
package com.agus.android.php; /** * Class InsertActivity * @version 1.0 Dec 18, 2011 * @author Agus Haryanto (agus.superwriter@gmail.com) * @website http://agusharyanto.net */ import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class InsertActivity extends Activity { private EditText txtNama; private EditText txtHarga; private Button btnSimpan; // Seusuaikan url dengan nama domain yang anda gunakan private String url = "http://10.0.2.2/android/addmakanan.php"; /** * Method yang dipanggil pada saat aplikaasi dijalankan * */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tambah); txtNama = (EditText) findViewById(R.id.txtNama); txtHarga = (EditText) findViewById(R.id.txtHarga); btnSimpan = (Button) findViewById(R.id.btnSimpan); // daftarkan even onClick pada btnSimpan btnSimpan.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { try { // setiap parameter yang akan dikirim melalui http // harus encode agar // dapat terbaca dengan baik oleh server String nama = URLEncoder.encode(txtNama.getText() .toString(), "utf-8"); String harga = URLEncoder.encode(txtHarga.getText() .toString(), "utf-8"); url += "?nama=" + nama + "&harga=" + harga; getRequest(url); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } /** * Method untuk Mengirimkan data kes erver event by button login diklik * * @param view */ public void getRequest(String Url) { Toast.makeText(this, "Tambah Data " + Url + " ", Toast.LENGTH_SHORT) .show(); HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(url); try { HttpResponse response = client.execute(request); Toast.makeText(this, "Tambah Data " + request(response) + " ", Toast.LENGTH_SHORT).show(); } catch (Exception ex) { Toast.makeText(this, "Tambah Data Gagal !", Toast.LENGTH_SHORT) .show(); } } /** * Method untuk Menenrima data dari server * * @param response * @return */ public static String request(HttpResponse response) { String result = ""; try { InputStream in = response.getEntity().getContent(); BufferedReader reader = new BufferedReader( new InputStreamReader(in)); StringBuilder str = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { str.append(line + "\n"); } in.close(); result = str.toString(); } catch (Exception ex) { result = "Error"; } return result; } }
6. Waktunya kita buat Class untuk menampilkan data dari server dalam bentuk JSON,
buat class baru dengan nama JSONActivity.java
package com.agus.android.php; /** * Class JSONActivity * @version 1.0 Dec 18, 2011 * @author Agus Haryanto (agus.superwriter@gmail.com) * @website http://agusharyanto.net */ import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONObject; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast; public class JSONActivity extends Activity { private JSONObject jObject; private String xResult =""; //Seusuaikan url dengan nama domain yang anda gunakan private String url = "http://10.0.2.2/android/daftarmakanan.php"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.daftarmakanan); TextView txtResult = (TextView)findViewById(R.id.TextViewResult); xResult = getRequest(url); try { parse(txtResult); } catch (Exception e) { e.printStackTrace(); } } private void parse(TextView txtResult) throws Exception { jObject = new JSONObject(xResult); JSONArray menuitemArray = jObject.getJSONArray("makanan"); String sret=""; for (int i = 0; i < menuitemArray.length(); i++) { sret +=menuitemArray.getJSONObject(i) .getString("nama_makanan").toString()+" : "; System.out.println(menuitemArray.getJSONObject(i) .getString("nama_makanan").toString()); System.out.println(menuitemArray.getJSONObject(i).getString( "harga").toString()); sret +=menuitemArray.getJSONObject(i).getString( "harga").toString()+"\n"; } txtResult.setText(sret); } /** * Method untuk Mengirimkan data kes erver * event by button login diklik * * @param view */ public String getRequest(String Url){ String sret=""; HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(Url); try{ HttpResponse response = client.execute(request); sret =request(response); }catch(Exception ex){ Toast.makeText(this,"Gagal "+sret, Toast.LENGTH_SHORT).show(); } return sret; } /** * Method untuk Menenrima data dari server * @param response * @return */ public static String request(HttpResponse response){ String result = ""; try{ InputStream in = response.getEntity().getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder str = new StringBuilder(); String line = null; while((line = reader.readLine()) != null){ str.append(line + "\n"); } in.close(); result = str.toString(); }catch(Exception ex){ result = "Error"; } return result; } }
7. Edit file AndroidMainifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.agus.android.php" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <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=".InsertActivity" android:label="Tambah Data"> </activity> <activity android:name="JSONActivity" android:label="Daftar Makanan"> </activity> </application> <uses-permission android:name="android.permission.INTERNET"> </uses-permission> </manifest>
8. Semua pekerjaan koding sudah kita lakukan sekarang saatnya Running Time
Sentuh Tampilkan data, Wow amazing data yang ada didatabase MySQL dapat tampil diandroid. Android memang joss.
Sentuh Tambah Data, Lalu isikan data sebagai beriku
Untuk Menyimpan Data Sentuk Tombol Simpan, Jika data yang disimpan berhasil
akan muncul Toast “Tambah Data SUCCESS”
Kembali ke menu lalu Sentuh Tampilkan Data
Alhamdulillah, Data yang kusimpan ternyata berhasil tersimpan di database MySQL
Tutorial ini khusus saya buat untuk para pembaca blog agusharyanto.net yang banyak menanyakan
bagaimana mengakses atau membaca data yang berada diserver dalam hal ini MySQL.
Tetaplah semangat adik-adik mahasiswaku, untuk belajar pemrograman janganlah mudah menyerah,
terus coba dan coba. Dengan sendirinya nanti engkau akan merasa bahwa koding itu nikmat.
Bahkan lebih nikmat dari main Game. Masak sih kak, Coba mari berfikir sejenak.
Pada saat kita koding dan saat bermain game sama-sama enaknya.
Perbedaanya adalah hasil dari kegiatan tersebut, mari kita renungkan beberapa pertanyaan dibawah ini :
- Apa hasil dari main game ?
- Apa hasil dari koding ?
- Kira-kira kalau melamar pekerjaan yang akan diterima yang jago main game atau yang jago koding,
atau yang jago bikin game ? - Bunda kita tercinta lebih bahagia mana, melihat anaknya menghabiskan waktu untuk main game atau
melihat anaknya menghabiskan waktu untuk koding ?. Jadi ingat waktu ngisi Seminar Android di
Universitas Budi Luhur, saya sampaikan tunjukkanlah pada orang tua kita, bahwa pengorbanan mereka
membiayai kita kuliah tidaklah sia-sia. Coba deh kita buat aplikasi sederhana dengan Android,
lalu kita tunjukkan kepada orang tua kita, perhatikanlah Expresi Wajah mereka. - Tidakkah kau ingin menjadi seorang sumber informasi, dimana jika ada tugs kuliah
yang ada hubungannya dengan koding, maka teman-temanmu akan bertanya kepadamu ?
Saya sendiri bukanlah orang yang anti game. Sesekali juga main game :).
Tapi hendaklah gunakanlah waktu dengan sebaik-baiknya. Yang sedang duduk dibangku kuliah,
bayangkan saat kita lulus, siapkah kita masuk kedunia kerja atau siapkah kita menjadi entrepreneur.
Boleh jadi jawabannya akan bergantung pada yang kita lakukan saat ini
Semoga Bermanfaat
Salam hangat
Agus Haryanto
referensi:
http://developer.andorid.com
http://about-android.blogspot.com/2010/03/androind-json-parser.html
@ugin, Betul untuk ICS keatas harus pakai Assynchtask
mas saya punya kasus sama kaya mas hadi
punya saya udah jalan,,, tp pas Tambah data / Tampilkan data kok selalu gagal ya??
padahal saat saya ngakses ip 10.0.2.2 di browser emulatornya bisa…
Keterangannya Gagal Gtu Aja
SSnya :
http://i.imgur.com/tUUdiOW.jpg?1
http://i.imgur.com/3a3yjcX.jpg?1
mohon bimbingannya
Email = rianerlangga03@gmail.com
100% work
makasih banyak pak tutorialnya, bermanfaat sekali !!! 😀
mas , klau misalkan server nya kita pake hosting , pas akses dari client nya , skrip bagian mana mas yg perlu d ubah ????
makasih banyak om u tutorial dan semangatnya
makasi buat tutorial ma semangatnya mas
pak mau tanya,
kalau kita mau menampilkan file gambar yang di simpan di database MySQL
di Aplikasi Android menggunakan JSON.. apakah Bisa Pak?
thanks mas atas sharing-nya… Insha Allah berkah…
“http://10.0.2.2/android/daftarmakanan.php”;
andorid itu nama databse nya apa gmna bang…yang 10.0.2.2 itu localhost ?
Terima kasih mas atas ilmu yang diberikan
ya walau saya belum mengerti
tapi tutor ini bermanfaat bagi newbie
heheheheee
😀
Sangat membantu saya yg lagi belajar, ma’kasih banyak mas tutorialnya. . . . .
mas saya punya kasus
gimna menampilkan jumlah isi tabel mysql di android?
mas saya punya kasus
gimana menampilkan jumlah isi tabel mysql di android
nun, coba select count(*) from table_name;
wow sangat berguna sekali infonya gan..
udah lama ane mao coba, dan akhirnya bermuara di blok agan..
izin share link ya gan ^^,
Jempol buat buat ente!!
Mas, kalo untuk yg ICS keatas tambahin AsyncTask nya dibagian mana ya? Udah coba-coba masih gak bisa, mohon bantuannya..
mas, saya uda ikut tutorialnya, tapi kok pada di run di android device, atau di emulatornya cuman muncul background putih aja ya? padahal String urlnya uda di set 10.0.2.2 kalau di emulator, dan url 127.0.0.1 kalau di run di device langsung, tolong bantuannya trims 😀
mas,saya mau nanya,,
kalau xampp saya itu adalah http://localhost:50/
lalu di coding javanya pas bagian url apa ada yang harus diganti??
trims…
@Otong, kalau aksesnya dari emulator yang satu komputer dengan servernya bisa pakai http://10.0.2.2:50/
@andrew, coba test dari browser dulu untuk memastikan servernya jalan
mas punya saya kalau dirun di android 2.3 bisa…
kalau di 4.0 ke atas kok data yang ditambahkan gagal ya?
itu gmn mas?
kalau di instal langsng di device, alamat localhostnya di ganti lg mas ?atw hrus di hosting dlu servernya ?
@intan, untuk os 4.0 keatas harus menggunakan assynch task untuk komunikasi dengan server
@rijal, alamat localhostnya yah harus diganti dengan ip komputernya dan komputer dan hp terhubung di jarinagan yang sama. kalau tidak terhubung berarti harus hosting biar bisa diakses dari jaringan internet
oh gtu,sdah di hosting mas.tpi mlh force close trs, dicoba di instal di device lngsung. Saya nyoba aplikasi maps dengan web service,pas di coba di emulator bisa jlan nrmal,pnya saran mas ?
@rijal, coba lihat errormya pada log cat agar dapat diketahui errornya apa.
error di AsyncTask nya,tp pas di coba di emulator trs almat url nya di ganti lgi sama localhost bisa jlan mas,errornya pas url nya diganti sma almat localhost yg sdah dihosting mas.
Bang klo pake database sql server, sama ndak prosesnya dengan database mysql..??
@wahyu, harusnya yang berubah hanya dibagian PHPnya saja
pa… kasus saya sama seperti yudi dan imam. dan kata bapak harus menggunakan Assynchtask, cara menggunakan Assynchtask nya. dmana paaa..? mhoon pencerahannya.. terimakasih
@angga, coba cek di http://agusharyanto.net/wordpress/?p=739 untuk pelajari tentang assynctask
pa,
kok saya runing malah force close ya ?
mohon pencerahannya
🙂
mas agus saya mau tanya kalo cara konekin aplikasi android ke server web berbasis (php & mysql) tapi pake WIFI (tanpa koneksi internet) bisa ga mas? boleh bantu tutorial nya buat skripsi saya ,terimakasih mas
@bayu, bisa. yang penting android dan server tehubung dengan jaringan yang sama.
mas ketika saya klik button simpan keluar error seperti ini…
mohon bantuannya
http://i60.tinypic.com/2hqb0ud.jpg
kalo saya ada error seperti ini
http://i.imgur.com/mEqfQYG.jpg
kira2 knapa ya ??
mas, yg bagian “url += “?nama=” + nama + “&harga=” + harga;”
kira2 yg paling depan “?nama=” bisa diganti dengan apa ya mas?
Soalnya kalau dipake input berkali2, namanya tetap sama dengan yg sebelumnya mas. Nuhun
mas agus saya ingin bertanya,mas saya menggunakan koneksi wifi dalam pengembangnya agar ip itu ter set otomatis diambil dari ip server yang dikoneksi gmana ya?
Sangat mengharapkan ada tutorial yang sama tapi menggunakan SDK yang terbaru (untuk ICS ke atas).
Terima kasih.
error di sini abang g’mana solusinya
Terima kasih banyak gan (y) mantap
pa agus, kenapa saat mmanggil php nya muncul error
Warning: mysql_connect() [function.mysql-connect]: Access denied for user ‘user’@’localhost’ (using password: YES) in C:\xampplite\htdocs\xampp\android\daftarmakanan.php on line 2
Cannot connect to the DB
trma ksih..
@yesti, itu berarti salah user dan passwordnya.
Makasih bos tutorial nya,
😀
mas agus punya saya gagal terus di penyimpanan dan tampilannya engga muncul knpa ya??
@pa agus, iya terima kasih pa
sore pak Agus,
mau tanya kalau php aja tanya sql kalau dibuat untuk aplikasi Android bagaimana caranya ya ?
mohon pencerahannya,
newbiedroid
Mas, mau nanya nih knp tiba2 json phpnya tidak bisa di akses padahal sebelumnya2 bisa setelah kesokan harinya pasti di run tidak bisa akses json php, mohon bimbingannya terima kasih
Pak kalau mau nambah tabel 2 dalam database kemudian berhubungan dengan tabel 1 yang lama, kira-kira apa yang perlu di tambahin pak..
Mau tanya pak kok waktu tampilkan data yg keluar hanya
Baca data….
Daftar makanan
Hasil JSON
Sementara hasil data mysql tidak keluar, padahal daftarmakanan.php nya jalan & insert datanya juga berhasil, mohon infonya ya pak, thanks