Android -php-mysql- JSON连接问题


Android -php-mysql- JSON connection issue

我导入了androidhive项目(http://www.androidhive.info/2012/05/how-to-connect-android-with-php-mysql/),并在数据库中添加了另一个表。第二个表的详细信息显示在第二个列表视图中。单击列表视图项后,将显示编辑页面。但是我没有在相应的编辑文本中得到第二个表的详细信息。

下面是我的java类: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();
    }
    }
   }
  • 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)
    
  • 这是php文件。

    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);
              }
             ?>
    

    从Getjuice doInBackground中取出runOnUiTread调用。把EditTexts的setText语句放到onPostExecute中。