Mysql
 sql >> Datenbank >  >> RDS >> Mysql

In meiner Android-Anwendung können keine Daten aus der MySQL-Datenbank in ListView abgerufen werden

Hier ist ein paar Dinge im Gange, ich werde versuchen, darauf einzugehen, was ich kann.

Dieser Protokolleintrag ist verdächtig:

03-22 22:30:42.860: E/ERROR(6055): Illegal character in query at index 53: http://necrecords.16mb.com/getproducts.php?password=A AA E EEE

Auch aus diesem Protokoll:

03-22 22:54:08.000: E/ERROR(7654): Error converting result java.lang.NullPointerException: lock == null

Sie können sehen, dass Sie von dieser PHP-Seite keine gültige Antwort erhalten.

Dieser Codeblock löst eine Ausnahme aus:

//convert response to string
   try{
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
              sb.append(line + "\n");
        }
        is.close();         
        result=sb.toString();
   }catch(Exception e){
        Log.e("ERROR", "Error converting result "+e.toString());

Ich habe gerade die URL in einem Browser ausprobiert, und es hat funktioniert, da der Browser die URL automatisch richtig codiert, etwa so:

http://necrecords.16mb.com/getproducts.php?password=A%20AA%20E%20EEE

Ich denke, dass Sie nur die URL richtig codieren müssen, da die Zeichenfolge Leerzeichen enthält.

String query = URLEncoder.encode(mname, "utf-8");

httppost= new HttpPost("http://necrecords.16mb.com/getsongslist.php?password="+query);
response=httpclient.execute(httppost);     

Was das Problem betrifft, dass Ihre Liste verdoppelt wird, können Sie die Liste einfach jedes Mal löschen, wenn die AsyncTask ausgeführt wird:

protected Void doInBackground(Void...params){ 

   InputStream is=null;
   String result="";
   try{

   records.clear(); //clear the list before re-populating

   httpclient=new DefaultHttpClient();
      httppost= new HttpPost("http://necrecords.16mb.com/getproducts.php");
   response=httpclient.execute(httppost);         
         HttpEntity entity = response.getEntity();
         is = entity.getContent();

   }catch(Exception e){

Noch etwas zu erwähnen, Sie werden wahrscheinlich für jede Aktivität einen separaten Adapter erstellen wollen. So wie es jetzt ist, verwenden Sie denselben Adapter für beide Aktivitäten.

Im getView() Ihres Adapters , verweisen Sie auf R.id.pro_name und R.id.pro_uprice , aber Sie verwenden diesen Adapter in Ihren beiden Aktivitäten. Enthalten Ihre beiden Aktivitäten diese Elemente in ihrer Layout-XML?

    public View getView(int position, View convertView, ViewGroup parent) {

     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     View itemView = inflater.inflate(groupid, parent, false);
     String[] row_items=records.get(position).split("__");
     TextView textName= (TextView) itemView.findViewById(R.id.pro_name);
     textName.setText(row_items[0]);
     TextView textPrice= (TextView) itemView.findViewById(R.id.pro_uprice);
     textPrice.setText(row_items[1]+"$");
     return itemView;
}