Android数据从数据库中取数据库不工作(php + json + mysql)
尽管我知道这个问题已经多次发布在堆栈溢出上了,但我已经尝试了所有的解决方案,并没有为我工作。Android数据从数据库中取数据库不工作(php + json + mysql)
我试图在列表视图中显示数据。数据以json格式存储,在读取数据时,似乎android并未读取JSON数组,因此数据不会在列表视图中显示,而是保持为空。
的Java文件:
public class ReadResult extends ListActivity {
private ProgressDialog pDialog;
JSONParser jParser = new JSONParser();
ArrayList<HashMap<String, String>> ResultFetch;
private static String url_readResult = "http://10.0.2.2/Result-Viewer/php/ReadData.php";
private static final String TAG_SUCCESS = "success";
private static final String TAG_SCORE = "Score";
private static final String TAG_SEMESTER = "Semester";
private static final String TAG_PRODUCTS = "products";
JSONArray products = null;
ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.read_result);
list = (ListView) getListView();
ResultFetch = new ArrayList<HashMap<String, String>>();
new LoadResult().execute();
}
class LoadResult extends AsyncTask<String, String, String> {
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(ReadResult.this);
pDialog.setMessage("Loading Result. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
List<NameValuePair> param = new ArrayList<NameValuePair>();
JSONObject json = jParser.makeHttpRequest(url_readResult, "GET",
param);
Log.d("Result: ", json.toString());
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
JSONObject object = new JSONObject(json.toString());
products = object.getJSONArray(TAG_PRODUCTS);
for (int i = 0; i < products.length(); i++) {
JSONObject c = products.getJSONObject(i);
String Semester = c.getString(TAG_SEMESTER);
String Score = c.getString(TAG_SCORE);
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_SEMESTER, Semester);
map.put(TAG_SCORE, Score);
ResultFetch.add(map);
}
} else {
Toast toast = Toast.makeText(getApplicationContext(),
"No Result Found", Toast.LENGTH_SHORT);
toast.show();
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
pDialog.dismiss();
runOnUiThread(new Runnable() {
public void run() {
ListAdapter adapter = new SimpleAdapter(ReadResult.this,
ResultFetch, R.layout.list_item, new String[] {
TAG_SEMESTER, TAG_SCORE }, new int[] {
R.id.semester, R.id.score });
list.setAdapter(adapter);
}
});
}
}
}
php文件:
<?php
session_start();
$cid = $_SESSION["cid"];
$rno = $_SESSION["rno"];
$response = array();
$conn=new PDO('mysql:host=localhost;dbname=result','root' ,'');
$result=$conn->query("Select * from $cid where RegistrationNumber = '$rno'");
if($result->rowcount()>0)
{
$response["products"] = array();
foreach($result as $row)
{
$product["Semester"] = $row["Semester"];
$product["Score"] = $row["Score"];
$response["success"] = 1;
array_push($response["products"], $product);
echo json_encode($response);
}
}
else
{
$response["success"] = 0;
$response["message"] = "No record found.";
echo json_encode($response);
}
?>
我已经通过了通过手的CID,RNO和密码页面,以下是生成的JSON输出通过运行读取数据页面。
JSON输出:
{"products":[{"Semester":"0","Score":"0"}],"success":1}
我得到了你的代码中的注释,这可能有助于。下面一行是无用
JSONObject object = new JSONObject(json.toString());
,你可以只使用json
为您JSONObject
,而不是创建一个新的。
在回复来自Sarthak Garg的评论时,我发布了一个使用Gson将字符串响应转换为Java对象的示例。
我个人采取了一种不同的方法来打电话给你的网络服务,但这超出了本次讨论的范围,所以我只会说给我你现有的代码示例。
您的代码示例中的以下行为您提供了一个json对象,该对象可以轻松转换为字符串。
JSONObject json = jParser.makeHttpRequest(url_readResult, "GET",param);
String myString = json.toString();
Gson为你做的是解析json和从中提取你需要的各个部分的繁琐工作。要了解Gson的全部功能,您需要执行一些Google搜索,我给您的示例只是您可以用它做的一件事。
此示例所做的是创建一个新的Gson实例,然后使用该实例将您的json字符串转换为POJO(普通旧Java对象)。将YourPojo类想象成一个模板,您可以将它用于Gson,以告诉它它将呈现什么样的外观,以及您希望生成的对象的外观如何。
Gson gson = new Gson();
YourPojo pojo = gson.fromJson(myString, YourPojo.class);
你要在这里做的唯一的额外工作是创建YourPojo类,幸好有工具,有哪些可以用,例如帮助this one
这些工具将采用您提供的json示例并为您生成Pojo类或类。你所需要做的就是提供班级名称。
如果你已经成功实现了这个功能,你可以在POJO对象上调用pojo.getProducts()
和pojo.getSuccess()
等方法。
所以你做了什么来调试呢?你检查什么是在Android中到达?也许你的PHP正在吐出警告,腐蚀JSON。 –
我正在读取结果页面中的进度条,但之后没有任何工作。我在结果页面的日志文件中获得成功= 1。之后,我得到一个警告/错误:对于产品没有价值。 –
您是否考虑过使用Gson将您的json映射到Java对象?它只会在几行内实现你想要做的。 –