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,
            List params) {
        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 ArrayList categoriesList;
    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 ArrayList categoriesList;
 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) {  
 }
}
26 Dec 2013

0 comments :

Post a Comment

:) :)) ;(( :-) =)) ;( ;-( :d :-d @-) :p :o :>) (o) [-( :-? (p) :-s (m) 8-) :-t :-b b-( :-# =p~ $-) (b) (f) x-) (k) (h) (c) cheer
Click to see the code!
To insert emoticon you must added at least one space before the code.

 
Top