There is a listview showing all products. It is supposed that a new activity page which allows me to edit product(either save or delete)will be shown after I click the item on the listview. However, when I click the item, the app stopped with error message: Unfortunately, XXX(my app name) has stopped. Could anyone help ? Thank you !
EditProductActivity.java
public class EditProductActivity extends Activity {
EditText txtName;
EditText txtPrice;
EditText txtDesc;
EditText txtCreatedAt;
Button btnSave;
Button btnDelete;
String pid;
// Progress Dialog
private ProgressDialog pDialog;
// JSON parser class
JSONParser jsonParser = new JSONParser();
// single product url
private static final String url_product_detials = "http://192.128.0.101/android_connect/get_product_details.php";
// url to update product
private static final String url_update_product = "http://192.128.0.101/android_connect/update_product.php";
// url to delete product
private static final String url_delete_product = "http://192.128.0.101/android_connect/delete_product.php";
// JSON Node names
private static final String TAG_SUCCESS = "success";
private static final String TAG_PRODUCT = "product";
private static final String TAG_PID = "pid";
private static final String TAG_NAME = "name";
private static final String TAG_PRICE = "price";
private static final String TAG_DESCRIPTION = "description";
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_product);
// save button
btnSave = (Button) findViewById(R.id.btnSave);
btnDelete = (Button) findViewById(R.id.btnDelete);
// getting product details from intent
Intent i = getIntent();
// getting product id (pid) from intent
pid = i.getStringExtra(TAG_PID);
// Getting complete product details in background thread
new GetProductDetails().execute();
// save button click event
btnSave.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
// starting background task to update product
new SaveProductDetails().execute();
}
});
// Delete button click event
btnDelete.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
// deleting product in background thread
new DeleteProduct().execute();
}
});
}
/**
* Background Async Task to Get complete product details
* */
class GetProductDetails extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(EditProductActivity.this);
pDialog.setMessage("Loading product details. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Getting product 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("pid", pid));
// getting product details by making HTTP request
// Note that product details url will use GET request
JSONObject json = jsonParser.makeHttpRequest(
url_product_detials, "GET", params);
// check your log for json response
Log.d("Single Product Details", json.toString());
// json success tag
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully received product details
JSONArray productObj = json
.getJSONArray(TAG_PRODUCT); // JSON Array
// get first product object from JSON Array
JSONObject product = productObj.getJSONObject(0);
// product with this pid found
// Edit Text
txtName = (EditText) findViewById(R.id.inputName);
txtPrice = (EditText) findViewById(R.id.inputPrice);
txtDesc = (EditText) findViewById(R.id.inputDesc);
// display product data in EditText
txtName.setText(product.getString(TAG_NAME));
txtPrice.setText(product.getString(TAG_PRICE));
txtDesc.setText(product.getString(TAG_DESCRIPTION));
}else{
// product with pid 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 product Details
* */
class SaveProductDetails extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(EditProductActivity.this);
pDialog.setMessage("Saving product ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Saving product
* */
protected String doInBackground(String... args) {
// getting updated data from EditTexts
String name = txtName.getText().toString();
String price = txtPrice.getText().toString();
String description = txtDesc.getText().toString();
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair(TAG_PID, pid));
params.add(new BasicNameValuePair(TAG_NAME, name));
params.add(new BasicNameValuePair(TAG_PRICE, price));
params.add(new BasicNameValuePair(TAG_DESCRIPTION, description));
// sending modified data through http request
// Notice that update product url accepts POST method
JSONObject json = jsonParser.makeHttpRequest(url_update_product,
"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 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 product uupdated
pDialog.dismiss();
}
}
/*****************************************************************
* Background Async Task to Delete Product
* */
class DeleteProduct extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(EditProductActivity.this);
pDialog.setMessage("Deleting Product...");
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("pid", pid));
// getting product details by making HTTP request
JSONObject json = jsonParser.makeHttpRequest(
url_delete_product, "POST", params);
// check your log for json response
Log.d("Delete Product", 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();
}
}
}
You are using UI widgets from AsyncTask background thread:
protected String doInBackground(String... args) {
// getting updated data from EditTexts
String name = txtName.getText().toString();
String price = txtPrice.getText().toString();
String description = txtDesc.getText().toString();
this throws exception. Move this code to onPreExecute (which is called on UI thread) and store in class variables, then use in doInBackground.
If you are using Eclipse, try to enable LogCat, it is in menu:
Window->Show view>Other>LogCat
Surround the code of action of listView with this try-catch, and modify any exception handlig code, to catch any throwable and logging it like this:
try {
// Your code
} catch (Throwable t)
{
Log.e("error","error",t);
}
see the logcat output, should help.
Related
I've got a simple class. It loads data from my localhost and populates in a listview with android:id/list.
I've set a onclick listener to call my delete async task when I click an item.
My profileList.remove(position), works I can't seem to get the notifyDataSetChanged(); method to work and don't know where to place it?
Lastly, Im not sure but I don't think my class is referencing the position of the item I want to delete and matching it with my database? I keep getting "success=0 no profile" found in my LOG.
Any Ideas? I just want my count/listview to be refreshed and my item deleted.
Class:
public class ViewAllLocations extends ListActivity {
String id;
// Progress Dialog
private ProgressDialog pDialog;
// JSON parser class
JSONParser jsonParser = new JSONParser();
ArrayList<HashMap<String, String>> profileList;
SimpleAdapter adapter;
// url to get all products list
private static String url_all_profile = "http://MYIP:8888/android_connect/get_all_location.php";
// url to delete product
private static final String url_delete_profile = "http://MYIP:8888/android_connect/delete_location.php";
// JSON Node names
private static final String TAG_SUCCESS = "success";
private static final String TAG_LOCATION = "Location";
private static final String TAG_ID = "id";
private static final String TAG_LATITUDE = "latitude";
private static final String TAG_LONGITUDE = "longitude";
// products JSONArray
JSONArray userprofile = null;
TextView locationCount;
int count = 0;
Button deleteLocation;
ListView lo;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_all_locations);
// Hashmap for ListView
profileList = new ArrayList<HashMap<String, String>>();
deleteLocation = (Button) findViewById(R.id.deleteLocation);
locationCount = (TextView) findViewById(R.id.locationCount);
lo = (ListView) findViewById(android.R.id.list);
//setup adapter first //now no items, after getting items (LoadAllLocations) will update it
adapter = new SimpleAdapter(
ViewAllLocations.this, profileList,
R.layout.locationitem, new String[]{TAG_ID,
TAG_LATITUDE, TAG_LONGITUDE},
new int[]{R.id.id, R.id.latitude, R.id.longitude});
// updating listview
setListAdapter(adapter);
// Loading products in Background Thread
new LoadAllLocation().execute();
deleteLocation.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
}
});
// getting product details from intent
Intent i = getIntent();
// getting product id (pid) from intent
id = i.getStringExtra(TAG_ID);
// Get listview
ListView lo = getListView();
lo.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
new DeleteLocation(position).execute();
Map<String, String> item = profileList.get(position);
String selectedItemId = item.get(TAG_ID);
new DeleteLocation(position).execute(selectedItemId);
}
});
}
/**
* **************************************************************
* Background Async Task to Delete Product
*/
class DeleteLocation extends AsyncTask<String, String, Integer> {
int deleteItemPosition;
public DeleteLocation(int position) {
// TODO Auto-generated constructor stub
this.deleteItemPosition = position;
}
/**
* Before starting background thread Show Progress Dialog
*/
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(ViewAllLocations.this);
pDialog.setMessage("Deleting Location...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Deleting product
*/
protected Integer doInBackground(String... args) {
String selectedId = args[0];
// Check for success tag
int success = 0; //0=failed 1=success
try {
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", selectedId));
// getting product details by making HTTP request
JSONObject json = jsonParser.makeHttpRequest(
url_delete_profile, "POST", params);
// check your log for json response
Log.d("Delete Product", 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);
//you cant update UI on worker thread, it must be done on UI thread
// Toast.makeText(getApplicationContext(), "Location Deleted",
// Toast.LENGTH_SHORT).show();
//finish();
// }
} catch (JSONException e) {
e.printStackTrace();
}
return success;
}
/**
* After completing background task Dismiss the progress dialog
* *
*/
protected void onPostExecute(Integer result) {
// dismiss the dialog once product deleted
pDialog.dismiss();
if (result == 1) {
//success
//delete from list and update listview
profileList.remove(deleteItemPosition);
adapter.notifyDataSetChanged();
} else {
//failed
}
}
}
/**
* Background Async Task to Load all product by making HTTP Request
*/
class LoadAllLocation extends AsyncTask<String, String, Integer> {
int success;
/**
* Before starting background thread Show Progress Dialog
*/
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(ViewAllLocations.this);
pDialog.setMessage("Loading Locations. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
/**
* getting All products from url
*/
protected Integer doInBackground(String... args) {
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
// getting JSON string from URL
JSONObject json = jsonParser.makeHttpRequest(url_all_profile, "GET", params);
// Check your log cat for JSON reponse
Log.d("All Profiles: ", json.toString());
try {
// Checking for SUCCESS TAG
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// products found
// Getting Array of Products
userprofile = json.getJSONArray(TAG_LOCATION);
// looping through All Products
for (int i = 0; i < userprofile.length(); i++) {
JSONObject c = userprofile.getJSONObject(i);
// Storing each json item in variable
String id = c.getString(TAG_ID);
String latitude = c.getString(TAG_LATITUDE);
String longitude = c.getString(TAG_LONGITUDE);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(TAG_ID, id);
map.put(TAG_LATITUDE, latitude);
map.put(TAG_LONGITUDE, longitude);
// adding HashList to ArrayList
profileList.add(map);
}
} else {
// no products found
// Launch Add New product Activity
//Intent i = new Intent(getApplicationContext(),
// UserLocation.class);
// Closing all previous activities
// i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// startActivity(i);
}
} catch (JSONException e) {
e.printStackTrace();
}
return success;
}
/**
* After completing background task Dismiss the progress dialog
* *
*/
protected void onPostExecute(Integer result) {
// dismiss the dialog after getting all products
pDialog.dismiss();
locationCount.setText("" + profileList.size());
if (result == 1) {
//success
//update adapter items
adapter.notifyDataSetChanged();
} else {
//failed
//launch activity here
}
}
}
PHP:
<?php
/*
* Following code will delete a profile from table
* A product is identified by profile id (id)
*/
// array for JSON response
$response = array();
// check for required fields
if (isset($_POST['id'])) {
$id = $_POST['id'];
// include db connect class
require_once __DIR__ . '/db_connect.php';
// connecting to db
$db = new DB_CONNECT();
// mysql update row with matched pid
$result = mysql_query("DELETE FROM Location WHERE id = $id");
// check if row deleted or not
if (mysql_affected_rows() > 0) {
// successfully updated
$response["success"] = 1;
$response["message"] = "Profile successfully deleted";
// echoing JSON response
echo json_encode($response);
} else {
// no product found
$response["success"] = 0;
$response["message"] = "No Profile 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);
}
?>
I am trying to display information depending on the item pressed in a ListView. When click the item in List view,it will display the subject information.
But i faced a problem that is when click the item in List view,it cannot display the subject information based on the item that i clicked and display error in logcat.
Logcat Json response show that success get the subject information Single Product Details but still failed display subject information.Thanks
05-14 17:54:36.671: D/All Products:(1227): {"success":1,"products":[{"session":"2-2014\/2015","subject_code":"BITS 3323 Local Area Network","section":"1\/1","class_ID":"1"},{"session":"2-2014\/2015","subject_code":"BITS 3323 Local Area Network","section":"1\/2","class_ID":"2"},{"session":"2-2014\/2015","subject_code":"BITS 3323","section":"1\/2","class_ID":"8"},{"session":"2-2014\/2015","subject_code":"BITS2323 Wide Area Network","section":"1\/1","class_ID":"9"}]}
05-14 17:54:37.731: E/JSON Parser(1227): Error parsing data org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject
05-14 17:54:37.731: D/Single Product Details(1227): {"success":1,"products":[{"session":"2-2014\/2015","subject_code":"BITS 3323 Local Area Network","section":"1\/1","class_ID":"1"},{"session":"2-2014\/2015","subject_code":"BITS 3323 Local Area Network","section":"1\/2","class_ID":"2"},{"session":"2-2014\/2015","subject_code":"BITS 3323","section":"1\/2","class_ID":"8"},{"session":"2-2014\/2015","subject_code":"BITS2323 Wide Area Network","section":"1\/1","class_ID":"9"}]}
05-14 17:54:37.731: D/JSON Parser(1227): {"success":1,"products":[{"session":"2-2014\/2015","subject_code":"BITS 3323 Local Area Network","section":"1\/1","class_ID":"1"},{"session":"2-2014\/2015","subject_code":"BITS 3323 Local Area Network","section":"1\/2","class_ID":"2"},{"session":"2-2014\/2015","subject_code":"BITS 3323","section":"1\/2","class_ID":"8"},{"session":"2-2014\/2015","subject_code":"BITS2323 Wide Area Network","section":"1\/1","class_ID":"9"}]}
05-14 17:54:37.731: W/System.err(1227): org.json.JSONException: No value for product
I trying use some suggestion such as change echo->print in php, using require_once 'DB_Connect.php that provided in previous post to solve Error parsing data org.json.JSONExceptio but still does not work
Listview java to passes EditProductActivity2
public class AllAttendanceActivity extends ListActivity {
// Progress Dialog
private ProgressDialog pDialog;
// Creating JSON Parser object
JSONParser jParser = new JSONParser();
ArrayList<HashMap<String, String>> productsList;
// url to get all products list
private static String url_all_products = "http://192.168.1.14/android/get_class.php";
// JSON Node names
private static final String TAG_SUCCESS = "success";
private static final String TAG_PRODUCTS = "products";
private static final String TAG_PID = "class_ID";
private static final String TAG_NAME = "subject_code";
private static final String TAG_SECTION = "section";
// products JSONArray
JSONArray products = null;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.all_attendance);
// Hashmap for ListView
productsList = new ArrayList<HashMap<String, String>>();
// Loading products in Background Thread
new LoadAllProducts().execute();
// Get listview
ListView lv = getListView();
// on seleting single product
// launching Edit Product Screen
lv.setOnItemClickListener(new OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
String class_ID = ((TextView) view.findViewById(R.id.pid)).getText()
.toString();
// Starting new intent
Intent in = new Intent(getApplicationContext(),
EditProductActivity2.class);
// sending pid to next activity
in.putExtra(TAG_PID, class_ID);
// starting new activity and expecting some response back
startActivityForResult(in, 100);
}
});
}
// Response from Edit Product 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 LoadAllProducts extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(AllAttendanceActivity.this);
pDialog.setMessage("Loading Subject.. 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_products, "GET", params);
// Check your log cat for JSON reponse
Log.d("All Products: ", json.toString());
try {
// Checking for SUCCESS TAG
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// products found
// Getting Array of Products
products = json.getJSONArray(TAG_PRODUCTS);
// looping through All Products
for (int i = 0; i < products.length(); i++) {
JSONObject c = products.getJSONObject(i);
// Storing each json item in variable
String class_ID = c.getString(TAG_PID);
String subject_code = c.getString(TAG_NAME);
String section = c.getString(TAG_SECTION);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(TAG_PID,class_ID);
map.put(TAG_NAME, subject_code);
map.put(TAG_SECTION, section);
// adding HashList to ArrayList
productsList.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(
AllAttendanceActivity.this, productsList,
R.layout.list_item, new String[] { TAG_PID,
TAG_NAME,TAG_SECTION},
new int[] { R.id.pid, R.id.name,R.id.section});
// updating listview
setListAdapter(adapter);
}
});
}
}
}
public class EditProductActivity2
public class EditProductActivity2 extends Activity {
EditText txtName;
EditText txtPrice;
EditText txtDesc;
EditText txtCreatedAt;
Button btnSave;
Button btnDelete;
String class_ID;
String subject_code;
String session;
String section;
// Progress Dialog
private ProgressDialog pDialog;
// JSON parser class
JSONParser jsonParser = new JSONParser();
// single product url
private static final String url_class_detials = "http://192.168.1.14/android/get_class_details.php";
// url to update product
private static final String url_update_product = "http://10.0.2.2/android_connect/update_product.php";
// url to delete product
private static final String url_delete_product = "http://10.0.2.2/android_connect/delete_product.php";
// JSON Node names
private static final String TAG_SUCCESS = "success";
private static final String TAG_PRODUCT = "product";
private static final String TAG_PID = "class_ID";
private static final String TAG_NAME = "subject_code";
private static final String TAG_PRICE = "session";
private static final String TAG_DESCRIPTION = "section";
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_product);
// save button
btnSave = (Button) findViewById(R.id.btnSave);
btnDelete = (Button) findViewById(R.id.btnDelete);
// getting product details from intent
Intent i = getIntent();
// getting product id (pid) from intent
class_ID = i.getStringExtra(TAG_PID);
// Getting complete product details in background thread
new GetProductDetails().execute();
// save button click event
btnSave.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
// starting background task to update product
new SaveProductDetails().execute();
}
});
// Delete button click event
btnDelete.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View arg0) {
// deleting product in background thread
new DeleteProduct().execute();
}
});
}
/**
* Background Async Task to Get complete product details
* */
class GetProductDetails extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(EditProductActivity2.this);
pDialog.setMessage("Loading product details. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Getting product 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("pid", class_ID));
// getting product details by making HTTP request
// Note that product details url will use GET request
JSONObject json = jsonParser.makeHttpRequest(
url_class_detials, "GET", params);
// check your log for json response
Log.d("Single Product Details", json.toString());
// json success tag
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully received product details
Log.d("JSON Parser",json.toString() );
JSONArray productObj = json
.getJSONArray(TAG_PRODUCT); // JSON Array
// get first product object from JSON Array
JSONObject product = productObj.getJSONObject(0);
// product with this pid found
// Edit Text
txtName = (EditText) findViewById(R.id.inputName);
txtPrice = (EditText) findViewById(R.id.inputPrice);
txtDesc = (EditText) findViewById(R.id.inputDesc);
// display product data in EditText
txtName.setText(product.getString(TAG_NAME));
txtPrice.setText(product.getString(TAG_PRICE));
txtDesc.setText(product.getString(TAG_DESCRIPTION));
}else{
// product with pid 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 product Details
* */
class SaveProductDetails extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(EditProductActivity2.this);
pDialog.setMessage("Saving product ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Saving product
* */
protected String doInBackground(String... args) {
// getting updated data from EditTexts
subject_code = txtName.getText().toString();
session = txtPrice.getText().toString();
section = txtDesc.getText().toString();
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair(TAG_PID, class_ID));
params.add(new BasicNameValuePair(TAG_NAME, subject_code ));
params.add(new BasicNameValuePair(TAG_PRICE, session ));
params.add(new BasicNameValuePair(TAG_DESCRIPTION, section ));
// sending modified data through http request
// Notice that update product url accepts POST method
JSONObject json = jsonParser.makeHttpRequest(url_update_product,
"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 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 product uupdated
pDialog.dismiss();
}
}
/*****************************************************************
* Background Async Task to Delete Product
* */
class DeleteProduct extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(EditProductActivity2.this);
pDialog.setMessage("Deleting Product...");
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("pid", class_ID));
// getting product details by making HTTP request
JSONObject json = jsonParser.makeHttpRequest(
url_delete_product, "POST", params);
// check your log for json response
Log.d("Delete Product", 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();
}
}
}
PHP CODE
$response = array();
require_once __DIR__ . '/db_connect.php';
//require_once 'db_connect.php';
// connecting to db
$db = new DB_CONNECT();
// check for post data
if (isset($_GET["pid"])) {
$pid = $_GET['pid'];
// get a product from products table
$result = mysql_query("SELECT *FROM class WHERE class_ID=$pid ");
if (!empty($result)) {
// check for empty result
if (mysql_num_rows($result) > 0) {
$result = mysql_fetch_array($result);
$product = array();
$product["class_ID"] = $row["class_ID"];
$product["subject_code"] = $row["subject_code"];
$product["session"] = $row["session"];
$product["section"] = $row["section"];
// success
$response["success"] = 1;
// user node
$response["product"] = array();
array_push($response["product"], $product);
// echoing JSON response
echo json_encode($response);
} else {
// no product found
$response["success"] = 0;
$response["message"] = "No product found";
// echo no users JSON
echo json_encode($response);
}
} else {
// no product found
$response["success"] = 0;
$response["message"] = "No product 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);
}
?>
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();
}
}
}
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...
I want to check whether the class being execute or not. Because it didnt give any value on inputName and inputEmail. The value is retrieve from the database.
This is part of the code (SingleSubject.java)
public class SingleSubject extends Activity {
EditText txtName;
EditText txtEmail;
String matrix_id;
// Progress Dialog
private ProgressDialog pDialog;
// JSON parser class
JSONParser jsonParser = new JSONParser();
// single product url
private static final String url_subject_details = "http://192.168.1.12/android_project/get_subject_details.php";
// JSON Node names
private static final String TAG_SUCCESS = "success";
private static final String TAG_STUDENT = "student";
private static final String TAG_MATRIX_ID = "matrix_id";
private static final String TAG_NAME = "name";
private static final String TAG_EMAIL = "email";
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.single_subject);
// getting subject details from intent
Intent i = getIntent();
// getting matrix_id from intent
matrix_id = i.getStringExtra(TAG_MATRIX_ID);
TextView test = (TextView) findViewById(R.id.matrix_id);
test.setText(matrix_id);
// Getting complete matrix_id details in background thread
new GetSubjectDetails().execute();
}
/**
* Background Async Task to Get complete matrix_id details
* */
class GetSubjectDetails extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(SingleSubject.this);
pDialog.setMessage("Loading subject details. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Getting subject details in background thread
* */
protected JSONObject doInBackground(String... args) {
JSONObject json = null;
try {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("matrix_id", matrix_id));
json = jsonParser.makeHttpRequest(url_subject_details, "GET", params);
}
catch(Exception e)
{
e.printStackTrace();
}
return json;
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(JSONObject json) {
super.onPostExecute(json);
// check your log for json response
Log.d("Single Subject Details", json.toString());
// json success tag
success = json.getInt(TAG_SUCCESS);
if (success.equals(1)) {
// successfully received subject details
JSONArray subjectObj = json.getJSONArray(TAG_STUDENT); // JSON Array
// get first subject object from JSON Array
JSONObject subject = subjectObj.getJSONObject(0);
// subject with this matrix_id found
// Edit Text
txtName = (EditText) findViewById(R.id.inputName);
txtEmail = (EditText) findViewById(R.id.inputEmail);
// display subject data in EditText
txtName.setText(subject.getString(TAG_NAME));
txtEmail.setText(subject.getString(TAG_EMAIL));
}
// dismiss the dialog once got all details
pDialog.dismiss();
}
}
}
doInbackground is invoked on the background thread. No need to create a thread there
txtName = (EditText) findViewById(R.id.inputName);
txtEmail = (EditText) findViewById(R.id.inputEmail);
txtName.setText(subject.getString(TAG_NAME)); // updating ui not possible in doInbackground
txtEmail.setText(subject.getString(TAG_EMAIL));
Secondly you cannot update ui from a background thread. You need to update ui in onPostExecute .You can return result in doInbackground which is param to onPostExecute and update ui there.
You need to look at the docs of AsyncTask to understand more
http://developer.android.com/reference/android/os/AsyncTask.html
Edit:
Change this
class GetSubjectDetails extends AsyncTask<String, String, String> {
to
class GetSubjectDetails extends AsyncTask<String, String, JSONOBject> {
Then
protected JSONObject doInBackground(String... params) {
JSONObject json =null;
try {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("matrix_id", matrix_id));
json = jsonParser.makeHttpRequest(
url_subject_details, "GET", params);
}catch(Exception e)
{
e.printStacktrace();
}
return json;
}
Then
#Override
protected void onPostExecute(JSONObject json) {
super.onPostExecute(json);
pDialog.dismiss();
// parse json
// update ui
}
I can't display data from a MySQL database. I want to retrieve some data from my database and display it to the textview, but it's not working.
Java code:
public class Penjualan1 extends Activity {
// All xml labels
String pid;
TextView mejaTv;
TextView customerTv;
TextView keteranganTv;
// Progress Dialog
private ProgressDialog pDialog;
// Creating JSON Parser object
JSONParser jsonParser = new JSONParser();
// Profile JSON url
private static final String url_order_detials = "-my url-/get_penjualan_details.php";
// ALL JSON node names
private static final String TAG_PRODUCT = "product";
private static final String TAG_SUCCESS = "success";
private static final String TAG_GET = "get";
private static final String TAG_MEJA = "meja";
private static final String TAG_CUST = "customer";
private static final String TAG_KET = "keterangan";
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.f_penjualan1);
mejaTv = (TextView) findViewById(R.id.meja);
customerTv = (TextView) findViewById(R.id.customer);
keteranganTv = (TextView) findViewById(R.id.keterangan);
// Loading Profile in Background Thread
new GetProductDetails().execute();
}
/**
* Background Async Task to Get complete product details
* */
class GetProductDetails extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(Penjualan1.this);
pDialog.setMessage("Loading product details. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Getting product details in background thread
* */
protected String doInBackground(String... params) {
// updating UI from Background Thread
runOnUiThread(new Runnable() {
public void run() {
// Check for success tag
// TODO Auto-generated method stub
int success;
try {
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("pid", pid));
// getting product details by making HTTP request
// Note that product details url will use GET request
JSONObject json = jsonParser.makeHttpRequest(
url_order_detials, "GET", params);
// check your log for json response
Log.d("Single Product Details", json.toString());
// json success tag
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully received product details
JSONArray productObj = json
.getJSONArray(TAG_GET); // JSON Array
// get first product object from JSON Array
JSONObject product = productObj.getJSONObject(0);
// product with this pid found
// Edit Text
mejaTv = (TextView) findViewById(R.id.meja);
customerTv = (TextView) findViewById(R.id.customer);
keteranganTv = (TextView) findViewById(R.id.keterangan);
// display product data in EditText
mejaTv.setText(product.getString(TAG_MEJA));
customerTv.setText(product.getString(TAG_CUST));
keteranganTv.setText(product.getString(TAG_KET));
}else{
// product with pid 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();
}
}
}
PHP Code:
/*
* Following code will get single product details
* A product is identified by product id (pid)
*/
// 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["pid"])) {
$pid = $_GET['pid'];
// get a product from products table
$result = mysql_query("SELECT *FROM penjualan WHERE pid = $pid");
if (!empty($result)) {
// check for empty result
if (mysql_num_rows($result) > 0) {
$result = mysql_fetch_array($result);
$product = array();
$product["pid"] = $result["pid"];
$product["meja"] = $result["meja"];
$product["customer"] = $result["customer"];
$product["keterangan"] = $result["keterangan"];
// success
$response["success"] = 1;
// user node
$response["get"] = array();
array_push($response["get"], $product);
// echoing JSON response
echo json_encode($response);
} else {
// no product found
$response["success"] = 0;
$response["message"] = "No product found";
// echo no users JSON
echo json_encode($response);
}
} else {
// no product found
$response["success"] = 0;
$response["message"] = "No product 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);
}
?>
I've seen sample code from other posts, but I don't quite understand how to apply it. Can you please give me sample code?
PHP CODE
//you need add single quote near $pid
$result = mysql_query("SELECT *FROM penjualan WHERE pid = '$pid'");
For your java code :
public class Penjualan1 extends Activity {
// All xml labels
String pid;
TextView mejaTv;
TextView customerTv;
TextView keteranganTv;
// Progress Dialog
private ProgressDialog pDialog;
// Creating JSON Parser object
JSONParser jsonParser = new JSONParser();
// Profile JSON url
private static final String url_order_detials = "-my url-/get_penjualan_details.php";
// ALL JSON node names
private static final String TAG_PRODUCT = "product";
private static final String TAG_SUCCESS = "success";
private static final String TAG_GET = "get";
private static final String TAG_MEJA = "meja";
private static final String TAG_CUST = "customer";
private static final String TAG_KET = "keterangan";
String sMeja, sCustomer, sKeterangan; //Declare a variable to handle your data.
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.f_penjualan1);
mejaTv = (TextView) findViewById(R.id.meja);
customerTv = (TextView) findViewById(R.id.customer);
keteranganTv = (TextView) findViewById(R.id.keterangan);
// Loading Profile in Background Thread
new GetProductDetails().execute();
}
/**
* Background Async Task to Get complete product details
* */
class GetProductDetails extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(Penjualan1.this);
pDialog.setMessage("Loading product details. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Getting product details in background thread
* */
protected String doInBackground(String... params) {
// Check for success tag
// TODO Auto-generated method stub
int success;
try {
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("pid", pid));
// getting product details by making HTTP request
// Note that product details url will use GET request
JSONObject json = jsonParser.makeHttpRequest(
url_order_detials, "GET", params);
// check your log for json response
Log.d("Single Product Details", json.toString());
// json success tag
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully received product details
JSONArray productObj = json
.getJSONArray(TAG_GET); // JSON Array
// get first product object from JSON Array
JSONObject product = productObj.getJSONObject(0);
// product with this pid found
// Edit Text
// display product data in EditText
sMeja = product.getString(TAG_MEJA);
sCustomer = product.getString(TAG_CUST);
sKeterangan = product.getString(TAG_KET);
}else{
// product with pid not found
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url) {
// updating UI from Background Thread
runOnUiThread(new Runnable() {
public void run() {
mejaTv.setText(sMeja);
customerTv.setText(sCustomer);
keteranganTv.setText(sKeterangan);
}
});
// dismiss the dialog once got all details
pDialog.dismiss();
}
}
}
Done.. :D