Lihat Video :
Instalasi WAMP Server
WAMP memungkinkan Anda menginstal Apache, PHP dan MySQL dengan installer tunggal yang mengurangi beban menginstal & mengkonfigurasi secara terpisah. Atau Anda dapat menggunakan XAMP, LAMP (Linux) dan MAMP (MAC). WAMP juga menyediakan phpmyadmin untuk dengan mudah berinteraksi dengan database MySQL.
Men-download dan menginstal WAMP dari http://www.wampserver.com/en/. Pilih versi yang benar yang sesuai dengan sistem operasi Anda (32bit atau 64bit). Setelah Anda menginstal itu, buka program dari Start -> All Programs -> Wamp Server -> Mulai WampServer.
Buka http://localhost/ dan http://localhost/phpmyadmin/ untuk memverifikasi WAMP diinstal dengan sukses atau tidak.
Membuat Database MySQL
Untuk menunjukkan tutorial ini saya telah mengambil contoh Makanan Kategori API di mana kita melakukan dua operasi. Setelah semakin daftar kategori makanan dan lainnya adalah menciptakan kategori makanan baru. Jadi mari kita mulai membuat database untuk ini.
Buka phpmyadmin dari http://localhost/phpmyadmin/ dan membuat database dan tabel menggunakan query SQL berikut. Anda juga dapat menggunakan phpmyadmin GUI untuk membuat database dan tabel.
Membuat database
CREATE DATABASE food;
Membuat tabel kategori & memasukkan beberapa data.
CREATE TABLE IF NOT EXISTS `categories` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(30) NOT NULL, PRIMARY KEY (`id`) ); INSERT INTO `categories` (`name`) VALUES ('Beverages'), ('Bread'), ('Cereals'), ('Cheese'), ('Citrus Fruits');
Membuat Proyek PHP
Pada jendela PC lokasi default instalasi WAMP adalah C: \ wamp. Pergi ke direktori dan www terbuka ini direktori. Semua proyek PHP akan masuk ke direktori ini.
Proyek PHP kita akan membuat akan memiliki daftar file berikut.
Config.php - Semua variabel konfigurasi seperti nama database, username, password dan hal-hal lain yang terjadi di sini.
DbConnect.php - Sebuah kelas untuk membuka dan menutup koneksi database.
get_categories.php - Untuk mendapatkan daftar kategori makanan
new_category - Untuk membuat kategori makanan baru dalam database.
Saya telah menggunakan Netbeans IDE untuk mengembangkan proyek php saya. Ini adalah opsional, Anda dapat menggunakan IDE favorit Anda.
1. Buat folder baru bernama food_api di bawah C: \ wamp \ www direktori untuk proyek kami.
2. Buat file baru bernama config.php dan menulis kode berikut. Di sini kami sebutkan nama database, username, password dan nama host. Jika database mysql Anda memiliki password, jangan lupa untuk menentukan di sini.
define('DB_USERNAME', 'root'); define('DB_PASSWORD', ''); define('DB_HOST', 'localhost'); define('DB_NAME', 'food');3. Panggilan API pertama adalah daftar semua kategori makanan. Jadi membuat sebuah file bernama get_categories.php dengan mengikuti konten. Di sini kita cukup membuka koneksi database, menjalankan query pilih dan membangun array respon dan echo json.
get_categories.php get_categories.php include_once './DbConnect.php'; function getCategories(){ $db = new DbConnect(); // array for json response $response = array(); $response["categories"] = array(); // Mysql select query $result = mysql_query("SELECT * FROM categories"); while($row = mysql_fetch_array($result)){ // temporary array to create single category $tmp = array(); $tmp["id"] = $row["id"]; $tmp["name"] = $row["name"]; // push category to final json array array_push($response["categories"], $tmp); } // keeping response header to json header('Content-Type: application/json'); // echoing json result echo json_encode($response); } getCategories();
Anda dapat melihat output dari file ini dengan membuka http://localhost/food_api/get_categories.php
4. Panggilan API kedua adalah menciptakan kategori makanan baru. Jadi membuat sebuah file bernama new_category dengan mengikuti konten. Panggilan api ini menerima metode POST dan memeriksa nama parameter yang merupakan nama dari kategori baru yang akan dibuat dalam database.
new_category.php include_once './DbConnect.php'; function createNewCategory() { if (isset($_POST["name"]) && $_POST["name"] != "") { // response array for json $response = array(); $category = $_POST["name"]; $db = new DbConnect(); // mysql query $query = "INSERT INTO categories(name) VALUES('$category')"; $result = mysql_query($query) or die(mysql_error()); if ($result) { $response["error"] = false; $response["message"] = "Category created successfully!"; } else { $response["error"] = true; $response["message"] = "Failed to create category!"; } } else { $response["error"] = true; $response["message"] = "Category name is missing!"; } // echo json response echo json_encode($response); } createNewCategory();
Url untuk panggilan api ini adalah http://localhost/food_api/new_category.php.
Sampai saat ini kita sudah selesai dengan bagian sisi server. Saatnya untuk beralih ke bagian android.
Membuat Proyek Android
1. Buat proyek baru di Eclipse dari File ⇒ New ⇒ Proyek Aplikasi Android. Aku telah meninggalkan nama kegiatan utama saya sebagai MainActivity.java dan memberi nama paket sebagai info.androidhive.spinnermysql
2. Sebagai aplikasi ini akan menggunakan internet, kita perlu menambahkan izin INTERNET di AndroidManifest.xml berkas. Buka file AndroidManifest.xml dan tambahkan izin berikut.
<uses-permission android:name="android.permission.INTERNET"/>
AndroidManifest.xml
3. Buat file kelas bernama Category.php. Kelas model ini akan berguna untuk mengkonversi data json menjadi objek.
Category.php package info.androidhive.spinnermysql; public class Category { private int id; private String name; public Category(){} public Category(int id, String name){ this.id = id; this.name = name; } public void setId(int id){ this.id = id; } public void setName(String name){ this.name = name; } public int getId(){ return this.id; } public String getName(){ return this.name; } }
4. Saya menciptakan kelas lain untuk mengurus membuat panggilan API dan penanganan respon. Buat kelas bernama ServiceHandler.java dan menulis kode berikut. Metode makeServiceCall () harus dipanggil untuk membuat panggilan http.
ServiceHandler.java package info.androidhive.spinnermysql; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; 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.impl.client.DefaultHttpClient; import android.util.Log; public class ServiceHandler { static InputStream is = null; static String response = null; public final static int GET = 1; public final static int POST = 2; public ServiceHandler() { } /** * Making service call * @url - url to make request * @method - http request method * */ public String makeServiceCall(String url, int method) { return this.makeServiceCall(url, method, null); } /** * Making service call * @url - url to make request * @method - http request method * @params - http request params * */ public String makeServiceCall(String url, int method, Listparams) { try { // http client DefaultHttpClient httpClient = new DefaultHttpClient(); HttpEntity httpEntity = null; HttpResponse httpResponse = null; // Checking http request method type if (method == POST) { HttpPost httpPost = new HttpPost(url); // adding post params if (params != null) { httpPost.setEntity(new UrlEncodedFormEntity(params)); } httpResponse = httpClient.execute(httpPost); } else if (method == GET) { // appending params to url if (params != null) { String paramString = URLEncodedUtils .format(params, "utf-8"); url += "?" + paramString; } HttpGet httpGet = new HttpGet(url); httpResponse = httpClient.execute(httpGet); } httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "UTF-8"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); response = sb.toString(); } catch (Exception e) { Log.e("Buffer Error", "Error: " + e.toString()); } return response; } }
5. Sekarang desain antarmuka untuk aktivitas utama Anda. Saya telah menciptakan tata letak sederhana untuk memasukkan kategori baru dan spinner untuk menunjukkan kategori diambil dari database MySQL. Buka file activity_main.xml dan masukkan kode berikut.
activity_main.xml
Xml diatas menghasilkan UI berikut
6. Buka file MainActivity.java Anda menambahkan kode dasar seperti mendeklarasikan variabel yang diperlukan, klik tombol event, spinner pendengar dll,
URL_NEW_CATEGORY - Url untuk membuat kategori baru
URL_CATEGORIES - Url untuk mendapatkan daftar kategori
MainActivity.java public class MainActivity extends Activity implements OnItemSelectedListener { private Button btnAddNewCategory; private TextView txtCategory; private Spinner spinnerFood; // array list for spinner adapter private ArrayListcategoriesList; ProgressDialog pDialog; // API urls // Url to create new category private String URL_NEW_CATEGORY = "http://10.0.2.2/food_api/new_category.php"; // Url to get all categories private String URL_CATEGORIES = "http://10.0.2.2/food_api/get_categories.php"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnAddNewCategory = (Button) findViewById(R.id.btnAddNewCategory); spinnerFood = (Spinner) findViewById(R.id.spinFood); txtCategory = (TextView) findViewById(R.id.txtCategory); categoriesList = new ArrayList (); // spinner item select listener spinnerFood.setOnItemSelectedListener(this); // Add new category click event btnAddNewCategory.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (txtCategory.getText().toString().trim().length() > 0) { // new category name String newCategory = txtCategory.getText().toString(); // Call Async task to create new category new AddNewCategory().execute(newCategory); } else { Toast.makeText(getApplicationContext(), "Please enter category name", Toast.LENGTH_SHORT) .show(); } } }); new GetCategories().execute(); } }
Mendapatkan daftar kategori dan menunjukkan kepada mereka di Spinner
7. Saya mendefinisikan metode Async untuk mengambil daftar kategori dari MySQL dan menampilkan mereka dalam spinner. Tambahkan kode berikut setelah blok OnCreate di MainActivity.java. Saya juga menambahkan populateSpinner metode lain () untuk mengurus memuat data ke dalam spinner. Metode async ini harus disebut dalam metode OnCreate seperti GetCategories baru (). Mengeksekusi ()
MainActivity.java /** * Async task to get all food categories * */ private class GetCategories extends AsyncTask{ @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(MainActivity.this); pDialog.setMessage("Fetching food categories.."); pDialog.setCancelable(false); pDialog.show(); } @Override protected Void doInBackground(Void... arg0) { ServiceHandler jsonParser = new ServiceHandler(); String json = jsonParser.makeServiceCall(URL_CATEGORIES, ServiceHandler.GET); Log.e("Response: ", "> " + json); if (json != null) { try { JSONObject jsonObj = new JSONObject(json); if (jsonObj != null) { JSONArray categories = jsonObj .getJSONArray("categories"); for (int i = 0; i < categories.length(); i++) { JSONObject catObj = (JSONObject) categories.get(i); Category cat = new Category(catObj.getInt("id"), catObj.getString("name")); categoriesList.add(cat); } } } catch (JSONException e) { e.printStackTrace(); } } else { Log.e("JSON Data", "Didn't receive any data from server!"); } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); if (pDialog.isShowing()) pDialog.dismiss(); //populateSpinner(); } } /** * Adding spinner data * */ private void populateSpinner() { List lables = new ArrayList (); txtCategory.setText(""); for (int i = 0; i < categoriesList.size(); i++) { lables.add(categoriesList.get(i).getName()); } // Creating adapter for spinner ArrayAdapter spinnerAdapter = new ArrayAdapter (this, android.R.layout.simple_spinner_item, lables); // Drop down layout style - list view with radio button spinnerAdapter .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // attaching data adapter to spinner spinnerFood.setAdapter(spinnerAdapter); }
Jika Anda menjalankan proyek sekarang, Anda akan melihat data mysql dimuat ke spinner. Gunakan LogCat untuk debug kesalahan.
Memasukkan kategori makanan baru ke MySQL
8. Saya menambahkan metode async lain untuk memasukkan kategori makanan baru ke dalam database MySQL. Metode ini disebut dalam membuat tombol klik event baru menggunakan AddNewCategory baru (). Mengeksekusi (kategori baru)
/** * Async task to create a new food category * */ private class AddNewCategory extends AsyncTask{ boolean isNewCategoryCreated = false; @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(MainActivity.this); pDialog.setMessage("Creating new category.."); pDialog.setCancelable(false); pDialog.show(); } @Override protected Void doInBackground(String... arg) { String newCategory = arg[0]; // Preparing post params List params = new ArrayList (); params.add(new BasicNameValuePair("name", newCategory)); ServiceHandler serviceClient = new ServiceHandler(); String json = serviceClient.makeServiceCall(URL_NEW_CATEGORY, ServiceHandler.POST, params); Log.d("Create Response: ", "> " + json); if (json != null) { try { JSONObject jsonObj = new JSONObject(json); boolean error = jsonObj.getBoolean("error"); // checking for error node in json if (!error) { // new category created successfully isNewCategoryCreated = true; } else { Log.e("Create Category Error: ", "> " + jsonObj.getString("message")); } } catch (JSONException e) { e.printStackTrace(); } } else { Log.e("JSON Data", "Didn't receive any data from server!"); } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); if (pDialog.isShowing()) pDialog.dismiss(); if (isNewCategoryCreated) { runOnUiThread(new Runnable() { @Override public void run() { // fetching all categories new GetCategories().execute(); } }); } } }
Jalankan dan uji aplikasi lagi untuk memeriksa penyisipan.
Kode Lengkap
Berikut adalah kode lengkap MainActivity.java
package info.androidhive.spinnermysql; import java.util.ArrayList; import java.util.List; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements OnItemSelectedListener { private Button btnAddNewCategory; private TextView txtCategory; private Spinner spinnerFood; // array list for spinner adapter private ArrayListcategoriesList; ProgressDialog pDialog; // API urls // Url to create new category private String URL_NEW_CATEGORY = "http://10.0.2.2/food_api/new_category.php"; // Url to get all categories private String URL_CATEGORIES = "http://10.0.2.2/food_api/get_categories.php"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnAddNewCategory = (Button) findViewById(R.id.btnAddNewCategory); spinnerFood = (Spinner) findViewById(R.id.spinFood); txtCategory = (TextView) findViewById(R.id.txtCategory); categoriesList = new ArrayList (); // spinner item select listener spinnerFood.setOnItemSelectedListener(this); // Add new category click event btnAddNewCategory.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (txtCategory.getText().toString().trim().length() > 0) { // new category name String newCategory = txtCategory.getText().toString(); // Call Async task to create new category new AddNewCategory().execute(newCategory); } else { Toast.makeText(getApplicationContext(), "Please enter category name", Toast.LENGTH_SHORT) .show(); } } }); new GetCategories().execute(); } /** * Adding spinner data * */ private void populateSpinner() { List lables = new ArrayList (); txtCategory.setText(""); for (int i = 0; i < categoriesList.size(); i++) { lables.add(categoriesList.get(i).getName()); } // Creating adapter for spinner ArrayAdapter spinnerAdapter = new ArrayAdapter (this, android.R.layout.simple_spinner_item, lables); // Drop down layout style - list view with radio button spinnerAdapter .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // attaching data adapter to spinner spinnerFood.setAdapter(spinnerAdapter); } /** * Async task to get all food categories * */ private class GetCategories extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(MainActivity.this); pDialog.setMessage("Fetching food categories.."); pDialog.setCancelable(false); pDialog.show(); } @Override protected Void doInBackground(Void... arg0) { ServiceHandler jsonParser = new ServiceHandler(); String json = jsonParser.makeServiceCall(URL_CATEGORIES, ServiceHandler.GET); Log.e("Response: ", "> " + json); if (json != null) { try { JSONObject jsonObj = new JSONObject(json); if (jsonObj != null) { JSONArray categories = jsonObj .getJSONArray("categories"); for (int i = 0; i < categories.length(); i++) { JSONObject catObj = (JSONObject) categories.get(i); Category cat = new Category(catObj.getInt("id"), catObj.getString("name")); categoriesList.add(cat); } } } catch (JSONException e) { e.printStackTrace(); } } else { Log.e("JSON Data", "Didn't receive any data from server!"); } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); if (pDialog.isShowing()) pDialog.dismiss(); //populateSpinner(); } } /** * Async task to create a new food category * */ private class AddNewCategory extends AsyncTask { boolean isNewCategoryCreated = false; @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(MainActivity.this); pDialog.setMessage("Creating new category.."); pDialog.setCancelable(false); pDialog.show(); } @Override protected Void doInBackground(String... arg) { String newCategory = arg[0]; // Preparing post params List params = new ArrayList (); params.add(new BasicNameValuePair("name", newCategory)); ServiceHandler serviceClient = new ServiceHandler(); String json = serviceClient.makeServiceCall(URL_NEW_CATEGORY, ServiceHandler.POST, params); Log.d("Create Response: ", "> " + json); if (json != null) { try { JSONObject jsonObj = new JSONObject(json); boolean error = jsonObj.getBoolean("error"); // checking for error node in json if (!error) { // new category created successfully isNewCategoryCreated = true; } else { Log.e("Create Category Error: ", "> " + jsonObj.getString("message")); } } catch (JSONException e) { e.printStackTrace(); } } else { Log.e("JSON Data", "Didn't receive any data from server!"); } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); if (pDialog.isShowing()) pDialog.dismiss(); if (isNewCategoryCreated) { runOnUiThread(new Runnable() { @Override public void run() { // fetching all categories new GetCategories().execute(); } }); } } } @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { Toast.makeText( getApplicationContext(), parent.getItemAtPosition(position).toString() + " Selected" , Toast.LENGTH_LONG).show(); } @Override public void onNothingSelected(AdapterView arg0) { } }
0 comments :
Post a Comment
Click to see the code!
To insert emoticon you must added at least one space before the code.