2015-09-04 103 views
0

尽管我知道这个问题已经多次发布在堆栈溢出上了,但我已经尝试了所有的解决方案,并没有为我工作。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} 
+2

所以你做了什么来调试呢?你检查什么是在Android中到达?也许你的PHP正在吐出警告,腐蚀JSON。 –

+0

我正在读取结果页面中的进度条,但之后没有任何工作。我在结果页面的日志文件中获得成功= 1。之后,我得到一个警告/错误:对于产品没有价值。 –

+0

您是否考虑过使用Gson将您的json映射到Java对象?它只会在几行内实现你想要做的。 –

回答

0

我得到了你的代码中的注释,这可能有助于。下面一行是无用

JSONObject object = new JSONObject(json.toString()); 

,你可以只使用json为您JSONObject,而不是创建一个新的。

+0

对不起!但是这并没有为我解决。列表中仍然没有值。 –

+0

@SarthakGarg'成功'等于1还是0? – SaNtoRiaN

+0

成功值= 1 –

0

在回复来自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()等方法。