简体   繁体   中英

Android -php-mysql- JSON connection issue

I imported the androidhive project( http://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/ ) and I added another table to the database. The details of the second table are displayed in the second listview. After clicking on listview item the edit page is displayed. But I didn't get the second table details in the corresponding edittexts.

Here are my java classes: JSONParser.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
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 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 = "";

// constructor
public JSONParser() {

}

// function get json from url
// by making HTTP POST or GET method
public JSONObject makeHttpRequest(String url, String method,
        List<NameValuePair> params) {

    // Making HTTP request
    try {

        // check for request method
        if(method == "POST"){
            // request method is POST
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            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();
            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 (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;

}

}

2.JuicesActivity

  public class JuicesActivity extends ListActivity {

  // Progress Dialog
  private ProgressDialog pDialog;

  // Creating JSON Parser object
  JSONParser jParser = new JSONParser();

ArrayList<HashMap<String, String>> juicesList;

// url to get all products list
private static String url_all_juices = "http://10.0.2.2/android_connect/get_all_juices.php";

// JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_JUICES = "juices";
    private static final String TAG_JID = "j_id";
    private static final String TAG_JUICENAME = "juice_name";

// products JSONArray
JSONArray juices = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.all_juices);

    // Hashmap for ListView
    juicesList = new ArrayList<HashMap<String, String>>();

    // Loading products in Background Thread
    new LoadAllJuices().execute();

    // Get listview
    ListView jv = getListView();

    // on seleting single product
    // launching Edit Product Screen
    jv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting values from selected ListItem
            String j_id = ((TextView)         view.findViewById(R.id.jid)).getText().toString();

            // Starting new intent
            Intent in = new Intent(getApplicationContext(),EditJuice.class);
            // sending jid to next activity
            in.putExtra(TAG_JID, j_id);

            // starting new activity and expecting some response back
            startActivityForResult(in, 100);
        }
    });
}

// Response from Editjuice Activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // if result code 100
    if (resultCode == 100) {
        // if result code 100 is received 
        // means user edited/deleted product
        // reload this screen again
        Intent intent = getIntent();
        finish();
        startActivity(intent);
    }

}

/**
 * Background Async Task to Load all product by making HTTP Request
 * */
class LoadAllJuices extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(JuicesActivity.this);
        pDialog.setMessage("Loading juices.. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    /**
     * getting All products from url
     * */
    protected String doInBackground(String... args) {
        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        // getting JSON string from URL
        JSONObject json = jParser.makeHttpRequest(url_all_juices, "GET", params);

        // Check your log cat for JSON response
        Log.d("All Juices: ", json.toString());

        try {
            // Checking for SUCCESS TAG
            int success = json.getInt(TAG_SUCCESS);

            if (success == 1) {
                // products found
                // Getting Array of Products
                juices = json.getJSONArray(TAG_JUICES);

                // looping through All Products
                for (int i = 0; i < juices.length(); i++) {
                    JSONObject c = juices.getJSONObject(i);

                    // Storing each json item in variable
                    String id = c.getString(TAG_JID);
                    String name = c.getString(TAG_JUICENAME);

                    // creating new HashMap
                    HashMap<String, String> map = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    map.put(TAG_JID, id);
                    map.put(TAG_JUICENAME, name);

                    // adding HashList to ArrayList
                    juicesList.add(map);
                }
            } else {
                // no products found
                // Launch Add New product Activity
                Intent i = new Intent(getApplicationContext(),
                        NewProductActivity.class);
                // Closing all previous activities
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog after getting all products
        pDialog.dismiss();
        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                /**
                 * Updating parsed JSON data into ListView
                 * */
                ListAdapter adapter = new SimpleAdapter(
                        JuicesActivity.this, juicesList,
                        R.layout.list_juice, new String[] { TAG_JID,
                                TAG_JUICENAME},
                        new int[] { R.id.jid, R.id.jname });
                // updating list view
                setListAdapter(adapter);
            }
        });

    }

  }

  }

3.EditJuice

    public class EditJuice extends Activity {

    EditText jName,jpric,jseller;
    Button btnSavj,btnDeltJ;

    String juid;

// Progress Dialog
private ProgressDialog pDialog;

// JSON parser class
JSONParser jsonParser = new JSONParser();

// single product url
private static final String url_juice_details= "http://10.0.2.2/android_connect/get_juice_details.php";

// url to update product
private static final String url_update_juice =   "http://10.0.2.2/android_connect/update_juice.php";

// url to delete product
private static final String url_delete_juice = "http://10.0.2.2/android_connect/delete_juice.php";

// JSON Node names
private static final String TAG_SUCCESS = "success";
    private static final String TAG_JUICES = "juices";
    private static final String TAG_JID = "j_id";
    private static final String TAG_JUICENAME = "juice_name";
    private static final String TAG_JPRICE = "price";
    private static final String TAG_SELLER = "seller";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.editjuice);

    // save button
    btnSavj = (Button) findViewById(R.id.btnSaveJ);
    btnDeltJ = (Button) findViewById(R.id.btnDelJ);

    // getting juice details from intent
    Intent i = getIntent();

    // getting juice id jid from intent
    juid = i.getStringExtra(TAG_JID);

    // Getting complete juice details in background thread
    new Getjuice().execute();

    // save button click event
    btnSavj.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // starting background task to update product
            new Savejuice().execute();
        }
    });

    // Delete button click event
    btnDeltJ.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // deleting product in background thread
            new Deletejuice().execute();
        }
    });

    }

    /**
  * Background Async Task to Get complete product details
  * */
  class Getjuice extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(EditJuice.this);
        pDialog.setMessage("Loading juice details. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Getting juice details in background thread
     * */
    protected String doInBackground(String... params) {

        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                // Check for success tag
                int success;
                try {
                    // Building Parameters
                    List<NameValuePair> params = new ArrayList<NameValuePair>();
                    params.add(new BasicNameValuePair("j_id", juid));

                    // getting juice details by making HTTP request
                    // Note that juice details url will use GET request
                    JSONObject json = jsonParser.makeHttpRequest(url_juice_details,   "GET", params);

                    // check your log for json response
                    Log.d("Single juice Details", json.toString());

                    // json success tag
                    success = json.getInt(TAG_SUCCESS);
                    if (success == 1) {
                        // successfully received juice details
                        JSONArray juiceObj = json.getJSONArray(TAG_JUICES); // JSON   Array

                        // get first juice object from JSON Array
                        JSONObject juice = juiceObj.getJSONObject(0);

                        // juice with this jid found
                        // Edit Text
                        jName = (EditText) findViewById(R.id.EditNamej);
                        jpric = (EditText) findViewById(R.id.EditPricej);
                        jseller = (EditText) findViewById(R.id.Editseller);

                        // display product data in EditText
                        jName.setText(juice.getString(TAG_JUICENAME));
                        jpric.setText(juice.getString(TAG_JPRICE));
                        jseller.setText(juice.getString(TAG_SELLER));

                    }else{
                        // juice with jid not found
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });

        return null;
    }


    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once got all details
        pDialog.dismiss();
    }
    }

 /**
  * Background Async Task to  Save juice Details
  * */
  class Savejuice extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(EditJuice.this);
        pDialog.setMessage("Saving juice ...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Saving juice
     * */
    protected String doInBackground(String... args) {

        // getting updated data from EditTexts
        String juice_name = jName.getText().toString();
        String price = jpric.getText().toString();
        String seller = jseller.getText().toString();

        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair(TAG_JID, juid));
        params.add(new BasicNameValuePair(TAG_JUICENAME, juice_name));
        params.add(new BasicNameValuePair(TAG_JPRICE, price));
        params.add(new BasicNameValuePair(TAG_SELLER, seller));

        // sending modified data through http request
        // Notice that update juice url accepts POST method
        JSONObject json = jsonParser.makeHttpRequest(url_update_juice,"POST", params);

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

            if (success == 1) {
                // successfully updated
                Intent i = getIntent();
                // send result code 100 to notify about product update
                setResult(100, i);
                finish();
            } else {
                // failed to update juice
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }


    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once juice updated
        pDialog.dismiss();
    }
    }

  /*****************************************************************
 * Background Async Task to Delete Product
 * */
 class Deletejuice extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(EditJuice.this);
        pDialog.setMessage("Deleting juice...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Deleting product
     * */
    protected String doInBackground(String... args) {

        // Check for success tag
        int success;
        try {
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("j_id", juid));


            // getting product details by making HTTP request
            JSONObject json = jsonParser.makeHttpRequest(url_delete_juice, "POST", params);

            // check your log for json response
            Log.d("Delete juice", json.toString());

            // json success tag
            success = json.getInt(TAG_SUCCESS);
            if (success == 1) {
                // product successfully deleted
                // notify previous activity by sending code 100
                Intent i = getIntent();
                // send result code 100 to notify about product deletion
                setResult(100, i);
                finish();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once product deleted
        pDialog.dismiss();

    }

    }

   }
  1. AddJuiceActivity

     public class AddJuiceActivity extends Activity { // Progress Dialog private ProgressDialog pDialog; JSONParser jsonParser = new JSONParser(); EditText inputjName,inputPric,inputseller; // url to create new product private static String url_create_juice = "http://10.0.2.2/android_connect/create_juice.php"; // JSON Node names private static final String TAG_SUCCESS = "success"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.add_juice); // Edit Text inputjName=(EditText)findViewById(R.id.EditNam); inputPric = (EditText) findViewById(R.id.EditPric); inputseller = (EditText) findViewById(R.id.Editsell); // Create button Button btnj = (Button) findViewById(R.id.btnjuice); // button click event btnj.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // creating new product in background thread new CreateNewJ().execute(); } }); } /** * Background Async Task to Create new product * */ class CreateNewJ extends AsyncTask<String, String, String> { /** * Before starting background thread Show Progress Dialog * */ @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(AddJuiceActivity.this); pDialog.setMessage("Creating juice.."); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); } /** * Creating product * */ protected String doInBackground(String... args) { String juicename = inputjName.getText().toString(); String price = inputPric.getText().toString(); String seller = inputseller.getText().toString(); // Building Parameters List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("juice_name", juicename)); params.add(new BasicNameValuePair("price", price)); params.add(new BasicNameValuePair("seller", seller)); // getting JSON Object // Note that create product url accepts POST method JSONObject json = jsonParser.makeHttpRequest(url_create_juice,"POST", params); // check log cat fro response Log.d("Create Response", json.toString()); // check for success tag try { int success = json.getInt(TAG_SUCCESS); if (success == 1) { // successfully created product Intent i = new Intent(getApplicationContext(), JuicesActivity.class); startActivity(i); // closing this screen finish(); } else { // failed to create product } } catch (JSONException e) { e.printStackTrace(); } return null; } /** * After completing background task Dismiss the progress dialog * **/ protected void onPostExecute(String file_url) { // dismiss the dialog once done pDialog.dismiss(); } } } 

    LogCat:

      07-04 01:10:37.091: D/Single juice Details(891): {"success":1,"juice": [{"seller":"das","juice_name":"lemon","j_id":"9","price":"30.00"}]} 07-04 01:10:37.091: W/System.err(891): org.json.JSONException: No value for juices 07-04 01:10:37.101: W/System.err(891): at org.json.JSONObject.get(JSONObject.java:355) 07-04 01:10:37.101: W/System.err(891): at org.json.JSONObject.getJSONArray(JSONObject.java:549) 07-04 01:10:37.101: W/System.err(891): at com.example.androidhive.EditJuice$Getjuice$1.run(EditJuice.java:136) 07-04 01:10:37.101: W/System.err(891): at android.os.Handler.handleCallback(Handler.java:733) 07-04 01:10:37.141: W/System.err(891): at android.os.Handler.dispatchMessage(Handler.java:95) 07-04 01:10:37.181: W/System.err(891): at android.os.Looper.loop(Looper.java:136) 07-04 01:10:37.181: W/System.err(891): at android.app.ActivityThread.main(ActivityThread.java:5017) 07-04 01:10:37.181: W/System.err(891): at java.lang.reflect.Method.invokeNative(Native Method) 07-04 01:10:37.181: W/System.err(891): at java.lang.reflect.Method.invoke(Method.java:515) 07-04 01:10:37.191: W/System.err(891): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 07-04 01:10:37.251: W/System.err(891): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 07-04 01:10:37.251: W/System.err(891): at dalvik.system.NativeStart.main(Native Method) 

Here is the php files.

get_all_juices.php

     /*
     * Following code will list all the juices
       */

       // array for JSON response
       $response = array();



      // include db connect class
      require_once __DIR__ . '/db_connect.php';


       // connecting to db
      $db = new DB_CONNECT();


      // get all juices from juices table
       $result = mysql_query("SELECT * FROM juices") or die(mysql_error());


      // check for empty result
      if (mysql_num_rows($result) > 0) 
       {

       // looping through all results

       // juices node
       $response["juices"] = array();

      while ($row = mysql_fetch_array($result)) {

      // temp user array
      $juice = array();

       $juice["j_id"] = $row["j_id"];
      $juice["juice_name"] = $row["juice_name"];

      $juice["price"] = $row["price"];
      $juice["seller"] = $row["seller"];


        // push single juice into final response array
      array_push($response["juices"], $juice);

      }

      // success
       $response["success"] = 1;


       // echoing JSON response
     echo json_encode($response);
       } else {

        // no products found
        $response["success"] = 0;
         $response["message"] = "No juices found";


      // echo no users JSON
         echo json_encode($response);
       }
       ?>

update_juice

       <?php


       /*
       * Following code will update a juice information
        * A juice is identified by juice id (j_id)

       */

       // array for JSON response
       $response = array();


      // check for required fields
      if (isset($_POST['j_id']) && isset($_POST['juice_name']) &&               isset($_POST['price'])
       && isset($_POST['seller'])) 
      {

       $j_id = $_POST['j_id'];
       $juice_name = $_POST['juice_name'];
      $price = $_POST['price'];
      $seller = $_POST['seller'];


     // include db connect class
     require_once __DIR__ . '/db_connect.php';

      // connecting to db
        $db = new DB_CONNECT();


      // mysql update row with matched j_id
         $result = mysql_query("UPDATE juices SET juice_name = '$juice_name',
       price = '$price', seller = '$seller' WHERE j_id = $j_id");


        // check if row inserted or not
        if ($result)
          {

        // successfully updated
         $response["success"] = 1;
        $response["message"] = "juice 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);
         }
         ?>

get_juice_details

        <?php

         /*

         * Following code will get single juice details
       * A juice is identified by juice id (j_id)
        */

       // array for JSON response
        $response = array();



      // include db connect class
        require_once __DIR__ . '/db_connect.php';


       // connecting to db
       $db = new DB_CONNECT();


        // check for post data
       if (isset($_GET["j_id"]))
       {

       $j_id = $_GET['j_id'];


        // get a juice from juices table
          $result = mysql_query("SELECT *FROM juices WHERE j_id = $j_id");


        if (!empty($result))
         {

         // check for empty result
       if (mysql_num_rows($result) > 0)
       {

         $result = mysql_fetch_array($result);


        $juice = array();

         $juice["j_id"] = $result["j_id"];

         $juice["juice_name"] = $result["juice_name"];

        $juice["price"] = $result["price"];

        $juice["seller"] = $result["seller"];

       // success
        $response["success"] = 1;


        // user node
        $response["juice"] = array();

        array_push($response["juice"], $juice);


        // echoing JSON response
            echo json_encode($response);
        } else {

        // no juice found
        $response["success"] = 0;
        $response["message"] = "No juice found";


       // echo no users JSON
        echo json_encode($response);
         }
          } else {

       // no juice found
        $response["success"] = 0;
          $response["message"] = "No juice 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);
          }
         ?>

Take out the runOnUiTread call from Getjuice doInBackground. Put the setText statements for the EditTexts in onPostExecute. Thats a start...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM