2015-09-04 61 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()等方法。