Android tidak mempunyai API yang memungkinkan untuk bisa berhubungan dengan database MySql secara langsung (via tembak IP komputer server), selain itu cara tembak IP seperti itu tidak dianjurkan karena alasan keamanan dan beberapa alasan lainnya seperti portabilitas, lebih lengkapnya silahkan ikuti diskusinya disini.
Cara yang dianjurkan untuk berkomunikasi dengan database server seperti MySql adalah dengan menggunakan Web Service. Pada tulisan ini saya akan sharing mengenai cara membaca data yang berada pada remote MySql server untuk kemudian ditampilkan pada sebuah ListView dan sebuah halaman detail.
Menyiapkan Database
Langkah pertama adalah kita siapkan database terlebih dahulu. Saya membuat database dengan nama androiddataserver dengan sebuah tabel yang bernama product. Berikut ini adalah struktur tabel tersebut.
1 2 3 4 5 6 7 |
CREATE TABLE `product` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `price` decimal(10,2) NOT NULL, `description` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 |
Menulis Kelas Domain
Seperti biasa kita buat sebuah kelas domain. Berikut adalah kode dari kelas Product yang merupakan representasi dari tabel product.
file : Product.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
package com.agungsetiawan.jexcelreport.domain; import java.math.BigDecimal; /** * * @author awanlabs */ public class Product { private Integer id; private String name; private BigDecimal price; private String description; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } } |
Membuat Web Service Menggunakan PHP
Untuk kemudahan tutorial bagi pembaca yang masih awam OOP pada PHP maka bagian web service yang menangani request dan repsonse data kita buat dengan menggunakan PHP procedural yang masih menggunakan fungsi MySql extension (mysql_xxx).
Web service kita nantinya bisa menerima 2 request. Pertama adalah request untuk meminta semua data product yang ada di database sedangkan yang kedua adalah untuk menerima request berupa permintaan satu data product.
Developer dianjurkan untuk mulai menggunakan OOP dan PDO untuk komunikasi dengan database
Baca artikel yang membahas PDO di link berikut
PHP : Beralih dari Ekstensi Mysql ke PDO
Dibawah ini adalah kode untuk koneksi ke database
file : connection.php
1 2 3 4 5 6 |
<?php mysql_connect("localhost","root",""); mysql_select_db("androiddataserver"); ?> |
Request permintaan semua data product akan dihandle oleh kode berikut ini
file : index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php mysql_connect("localhost","root",""); mysql_select_db("androiddataserver"); $data=mysql_query("select * from product"); $arrayProduct=array(); $list=array(); while($row=mysql_fetch_array($data)){ $arrayProduct["id"]=$row["id"]; $arrayProduct["name"]=$row["name"]; $arrayProduct["price"]=$row["price"]; $arrayProduct["description"]=$row["description"]; $list[]=$arrayProduct; } echo json_encode($list); ?> |
Kode diatas sangat sederhana dan sangat polos karena tidak menerapkan pattern apapun. Coba akses file diatas maka hasil yang muncul pada browser adalah data-data yang terdapat pada database dalam format Json.
Berikut ini adalah screenshotnya.
Selanjutnya kita tulis kode untuk menangani permintaan satu data product dengan id tertentu. Berikut adalah kodenya
file : detail.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php include("connection.php"); $id=$_GET["id"]; $data=mysql_query("select * from product where id=$id"); $arrayProduct=array(); while($row=mysql_fetch_array($data)){ $arrayProduct["id"]=$row["id"]; $arrayProduct["name"]=$row["name"]; $arrayProduct["price"]=$row["price"]; $arrayProduct["description"]=$row["description"]; } echo json_encode($arrayProduct); ?> |
Panggil file diatas dan jangan lupakan sertakan get variable dengan nama id. Berikut adalah hasilnya
Menulis CustomHttpClient
Android perlu memiliki kemampuan untuk membaca response dari Web Service yang berupa data Json tadi. Pada bagian ini kita akan menulis kelas yang bertugas untuk menangani hal tersebut. Kelas yang akan kita buat memanfaatkan library HttpClient yang bisa didownload disini.
Jangan lupa masukkan library tersebut kedalam classpath dari project Android kita
Berikut ini adalah kodenya
file : CustomHttpClient.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package com.agungsetiawan.androidmysql.http; import java.io.BufferedReader; import java.io.IOException; 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; public class CustomHttpClient { HttpClient httpClient; HttpGet httpGet; HttpResponse httpResponse; public CustomHttpClient(){ httpClient=new DefaultHttpClient(); } public String get(String url) throws IOException{ httpGet=new HttpGet(url); httpResponse=httpClient.execute(httpGet); BufferedReader rd = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent())); String line = ""; StringBuilder builder=new StringBuilder(); while ((line = rd.readLine()) != null) { builder.append(line); } return builder.toString(); } } |
Membuat Custom ListView
Data semua product tadi akan ditampilkan pada Android dalam bentuk list menggunakan widget ListView. Pada bagian ini kita akan membuat custom list view.
Buatlah layout dengan struktur sebagai berikut
file : list_item_product.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingTop="8dp" android:paddingBottom="8dp" > <TextView android:id="@+id/txtName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp"/> </LinearLayout> |
Selanjutnya kita buat sebuah adapter untuk menampilkan data ke list view item
file : ProductAdapter.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
package com.agungsetiawan.androidmysql.adapter; import java.util.List; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; import com.agungsetiawan.androidmysql.R; import com.agungsetiawan.androidmysql.domain.Product; public class ProductAdapter extends ArrayAdapter<Product> { Context context; int layout; List<Product> listProduct; public ProductAdapter(Context context, int textViewResourceId, List<Product> objects) { super(context, textViewResourceId, objects); this.context=context; this.layout=textViewResourceId; this.listProduct=objects; } public View getView(int position,View convertView,ViewGroup parent){ View v=convertView; ProductHolder holder; if(v==null){ LayoutInflater vi=((Activity)context).getLayoutInflater(); v=vi.inflate(layout, parent, false); holder=new ProductHolder(); holder.textViewName=(TextView) v.findViewById(R.id.txtName); v.setTag(holder); }else{ holder=(ProductHolder) v.getTag(); } Product product=listProduct.get(position); holder.textViewName.setText(product.getName()); return v; } static class ProductHolder{ TextView textViewName; } } |
Menulis Activity
Seperti sudah saya kemukakan tadi diatas, aplikasi yang sedang kita buat memiliki 2 Activity, satu untuk menampilkan list semua data yang ada didatabse dan satu lagi untuk menampilkan detail dari data product.
Buat sebuah layout berikut ini untuk Activity menampilkan semua data
file : all_products.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".AllProducts" > <ListView android:id="@+id/listViewProduct" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout> |
Dan berikut adalah kode Activity-nya
file : AllProducts.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
package com.agungsetiawan.androidmysql; import java.io.IOException; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import com.agungsetiawan.androidmysql.adapter.ProductAdapter; import com.agungsetiawan.androidmysql.domain.Product; import com.agungsetiawan.androidmysql.http.CustomHttpClient; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; public class AllProducts extends Activity implements OnItemClickListener { ListView listViewProduct; CustomHttpClient client; List<Product> listProduct; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.all_products); listViewProduct=(ListView) findViewById(R.id.listViewProduct); client=new CustomHttpClient(); Gson gson=new Gson(); try { String json=client.get("http://192.168.43.35/androiddataserver/"); listProduct=gson.fromJson(json, new TypeToken<List<Product>>(){}.getType()); listViewProduct.setAdapter(new ProductAdapter(this, R.layout.list_item_product, listProduct)); listViewProduct.setOnItemClickListener(this); } catch (JsonSyntaxException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.all_products, menu); return true; } @Override public void onItemClick(AdapterView<?> arg0, View view, int position, long id) { Product product=listProduct.get(position); Intent intent=new Intent(this,ProductDetail.class); intent.putExtra("ID", product.getId()); startActivity(intent); } } |
Perhatikan pada baris yang saya tandai. Pada baris tersebut kita menggunakan library Gson untuk mengubah string dalam bentuk Json yang didapat dari web service ke dalam objek dari kelas Product.
Library tersebut dapat didownload disini dan jangan lupa masukkan ke classpath seperti tadi memasukkan library HttpClient.
Selanjutnya buat layout untuk Activity menampilkan detail product seperti dibawah ini
file : activity_product_detail.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
<LinearLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".ProductDetail" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Product Id" /> <EditText android:id="@+id/editTextId" android:layout_height="wrap_content" android:layout_width="match_parent"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Name" /> <EditText android:id="@+id/editTextName" android:layout_height="wrap_content" android:layout_width="match_parent"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Price" /> <EditText android:id="@+id/editTextPrice" android:layout_height="wrap_content" android:layout_width="match_parent"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Description" /> <EditText android:id="@+id/editTextDescription" android:layout_height="wrap_content" android:layout_width="match_parent"/> </LinearLayout> |
Kelas Activity-nya adalah dibawah ini
file : ProductDetail.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
package com.agungsetiawan.androidmysql; import java.io.IOException; import com.agungsetiawan.androidmysql.domain.Product; import com.agungsetiawan.androidmysql.http.CustomHttpClient; import com.google.gson.Gson; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.widget.EditText; public class ProductDetail extends Activity { EditText editTextId; EditText editTextName; EditText editTextPrice; EditText editTextDescription; int id; CustomHttpClient client; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_product_detail); editTextId=(EditText) findViewById(R.id.editTextId); editTextName=(EditText) findViewById(R.id.editTextName); editTextPrice=(EditText) findViewById(R.id.editTextPrice); editTextDescription=(EditText) findViewById(R.id.editTextDescription); Intent intent=getIntent(); id=intent.getIntExtra("ID", 1); client=new CustomHttpClient(); Gson gson=new Gson(); try { String json=client.get("http://192.168.43.35/androiddataserver/detail.php?id="+id); Product product=gson.fromJson(json, Product.class); editTextId.setText(String.valueOf(product.getId())); editTextName.setText(product.getName()); editTextPrice.setText(String.valueOf(product.getPrice())); editTextDescription.setText(product.getDescription()); } catch (IOException e) { e.printStackTrace(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.product_detail, menu); return true; } } |
Kembali kita gunakan Gson untuk mengubah string json menjadi objek product.
Jangan lupa tambahkan permisson pada file manifest agar aplikasi kita bisa mengakses internet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.agungsetiawan.androidmysql" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.agungsetiawan.androidmysql.AllProducts" 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.agungsetiawan.androidmysql.ProductDetail" android:label="@string/title_activity_product_detail" > </activity> </application> <uses-permission android:name="android.permission.INTERNET" /> </manifest> |
Running dan Screenshot Program
Jalankan aplikasi dan berikut adalah screenshotnya
Penutup
Sekian tutorial membaca data dari remote MySql server di Android
semoga bermanfaat 😀
Bagi yang menginginkan kedua sourcode diatas(PHP dan Android) silahkan tinggalkan email pada komentar 🙂
up up up mas 😀 bagi source codenya mas bwt experimen, biar bisa berkarya juga ^_^ sukses terus buat blognya 🙂
terima kasih telah berbagi, semoga ilmunya semakin bertambah amin,.,
mas, mau nanya untuk msalah gson nya masih error kira2 gara2 apa ya ?
nanya juga mas , kasusnya sama gson.class error (tidak ada), padahal library udah di add dan ga ada error di codingan, tp pas di run masih “Unfortunately has stopped” di logcat-nya error di gson.class
mohon bantuannya mas
skalian minta sourcecode boleh kan mas? hehe
email: riochimaru@gmail.com
mas bagi SC nya dong buat belajar, sukses terus blognya mas
Boleh minta source codenya pak ?
boleh minta source a donk, kirim kemari ya.. fadlimuhammad878@gmail.com thanks.. 😀 😀
arwan.pascaunhas2011@gmail.com…..tq…
bagus gan tutorialnya,, boleh berbagi 🙂
tolong kirim source code and projectnya donk
Thanks tutorialnya… Sangat membantu… 🙂
Jika boleh, tolong dikirim SC nya untuk mempelajarinya lebih lanjut…
Sebelum dan sesudahnya thank yo very much.. 🙂
Pas banget gan sama yg mau ane develop. Boleh berbagi sourcecodenya gan? Buat ngoprek yg punya ane 😀 Thanks a lot~
last_craftman@live.com
Kalau data tidak tertampil di listview, itu ada apa ya gan? Nyoba project agan di import tidak bisa di run, stopped. Thanks a lot~
Salam
Gan, saya tertarik sekali dengan scripx, tolong dikirim ke email saya, karena lagi senang2 nya belajar android, trima kasih dan salam android
bagus nih ilmunya, bila berkenan boleh donk source file nya. kalau database nya postrgree apakah caranya sama ya
keren mas (Y) sangat bermanfaat
minta sourcecode nya mas..
daniandikaputra@gmail.com
makasih sbelumnya 🙂
this my email arif.rohman02@gmail.com thank you
Mas boleh mnta source codenya?
Tlong krimin ya
Mkasih 🙂
source code nya dong gan, selvymetha95@gmail.com
nice project sir, boleh buat saling share, ahastaman@gmail.com
gan bagi source codenya dong…thx
gan boleh minta source codenya.. tolong kirim ke
rheza.redfoo@gmail.com
thanks 😀
boleh minta source code nya gan, mksh
ferdyrb@gmail.com
mas boleh minta full codenya?
dianawa_0620
dianawa0620@gmail.com
pak boleh mita source code bisa di kirim ke junajunaedi@yahoo.co.id
pak mau tanya kalo insert suatu tabel yang tabel tersebut berisi field
dari tabel lain gimana pak ? semisal mau insert di tabel mahasiswa ada field (id
mahasiswa, nama, id matakuliah(dari tabel matakuliah), nilai) .
Pak apakah tutorial tersebut sama halnya seperti parsing gitu ya??
lalu gimana caranya pak integrasi dengan akun jabber. Makasih sebelunya.
Saya sedang belajar android dari nol,kalo boleh minta source nya
terima kasih semoga berkah ilmunya mas.amin
Maaf saya lupa ketik emailnya
de2rusli.80@gmail.com
terima kasih