Autore Topic: ListView pulling data from MYSQL  (Letto 1820 volte)

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
ListView pulling data from MYSQL
« il: 01 Giugno 2011, 19:09:19 CEST »
0
Ciao ragazzi. Mi presento, sono Andrea e ho 26 anni. Sono in tesi presso l'università degli studi di Milano. Sto facendo una tesi su un quiz adaptive learning system. Si tratta di domande in single/multiple choice. Queste domande sono reperibili in remoto, e sono suddivise per argomenti.

Ecco il mio problema: come faccio a fare il retrieval degli argomenti disponibili ed inserirli in una ListView?
Ho creato l'httpClient che si connette al server tramite script php (la query ovviamente si trova all'interno di questo script) ma adesso non so come gestire i risultati della query.

Di seguito trovi un pò di codice (sicuramente sbagliato). Come potete vedere, sto provando ad inserire le ListView all'interno di una tabHost.


Codice (Java): [Seleziona]
package com.android.quizzle;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;
import android.widget.TextView;

public class MainMenuActivity extends Activity {

        private ListView ls1;

        private ListView ls2;

        private TabHost myTabHost;

        private TextView textView;

        private TextView error;
       
        String appoggio;

        @Override
        public void onCreate(Bundle icicle)

        {
                setContentView(R.layout.tabquiz);

                super.onCreate(icicle);

                ls1 = new ListView(MainMenuActivity.this);
                ls2 = new ListView(MainMenuActivity.this);

                Resources rs = getResources();

                this.myTabHost = (TabHost) this.findViewById(R.id.tabhost);
                this.myTabHost.setup();

                String result = "";

                // query post. I want to retrieve all the quiz questions with id=1;

                ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("id", "1"));

                // http post

                try {
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost(
                                        "http://miosito");
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                } catch (Exception e) {
                        Log.e("log_tag", "Error in http connection " + e.toString());
                }

                // convert response to string

                try {

                        InputStream is = null;
                        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();
                        result = sb.toString();

                } catch (Exception e) {
                        Log.e("log_tag", "Error converting result " + e.toString());
                }

               
               
                //information retrieval e memorizzazione

                       
                       
               
               
                // first tab
                TabSpec ts = myTabHost.newTabSpec("TAB_TAG_1");
                ts.setIndicator("Quiz disponibili",
                                rs.getDrawable(R.drawable.quiz_selected));
                ts.setContent(new TabHost.TabContentFactory() {

                        public View createTabContent(String tag) {
                               
                                ArrayList<String> appAL = new ArrayList<String>(50);
                                String stringaInizio = ";";
                                String stringaFine = ";";
                                appAL = fullArrayInt(appoggio, stringaInizio, stringaFine);

                                ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                                                MainMenuActivity.this,
                                                android.R.layout.simple_list_item_1,
                                                // i think that i must put the result of my query in
                                                // this array but i don't know how. (String[3] is just
                                                // an example.
                                                new String[3]);

                                ls1.setTextFilterEnabled(true);
                                ls1.setAdapter(adapter);

                                return ls1;

                        }

                });
                myTabHost.addTab(ts);

                TabSpec ts1 = myTabHost.newTabSpec("TAB_TAG_2");
                ts1.setIndicator("Quiz personalizzati",
                                rs.getDrawable(R.drawable.quiz_selected));
                ts1.setContent(new TabHost.TabContentFactory() {

                        public View createTabContent(String tag) {
                                ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                                                MainMenuActivity.this,
                                                android.R.layout.simple_list_item_1,
                                                // This is correct. All i need to do is exchange item4,5
                                                // and 6 with the result of my query.
                                                new String[] { "item4", "item5", "item6" });
                                ls2.setAdapter(adapter);
                                return ls2;
                        }
                });
                myTabHost.addTab(ts1);

        }

        //parsing
        public static ArrayList<String> fullArrayInt(String appoggio, String stringaInizio, String stringaFine){
                ArrayList<String> elencoInt = new ArrayList<String>(50);
                Pattern pattern = Pattern.compile("(.*?)"+stringaFine);
                Matcher m = pattern.matcher(appoggio);
                while(m.find())
                        elencoInt.add(m.group(1));
                return elencoInt;

        }              
}


Credo che dovrei memorizzare i risultati da qualche parte, magari in un array di stringhe (?). Ma non ne sono sicuro, sapreste darmi qualche consiglio?
« Ultima modifica: 02 Giugno 2011, 01:54:21 CEST da Ricky` »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ListView pulling data from MYSQL
« Risposta #1 il: 01 Giugno 2011, 21:24:18 CEST »
0
Servirebbe qualche informazione in più, come ad esempio i dati che ottieni come sono formattati e che risultato vuoi ottenere.


PS: Le chiamate http devono essere effettuato in un thread apposito, ti consiglio di utilizzare un AsyncTask.

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:ListView pulling data from MYSQL
« Risposta #2 il: 01 Giugno 2011, 22:42:42 CEST »
0
Ecco, il problema è proprio questo: gestire i dati.

Ecco il codice php sul server. Praticamente sto provando a  passare tramite POST il valore "id"

Codice (Java): [Seleziona]
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                nameValuePairs.add(new BasicNameValuePair("id", 1));

, per la formattazione dei dati non so, forse dovrei usare JSON per inserirlo nella ListView?!

Codice: [Seleziona]

<?php

$server = "http://mioserver";
$database = "******";
        $user = "****";
        $psw = "****";

$connect = @mysql_connect($server, $user, $psw);
       
        if (!@mysql_select_db($database,$connect)) {
                //Se non posso connettermi rimando l'utente nella Home Page
                exit("Impossibile accedere al server MySQL. Torna alla <a href='index.php'>Home page</a>.");
        }
        else
                mysql_error($connect);
?>

<?php
$dato = $_POST['id'];


    $q=mysql_query("SELECT text FROM `liform_wpsqt_questions` WHERE id='$dato'");
     

if (!$q) {
    $message  = 'Invalid query: ' . mysql_error() . "\n";
    $message .= 'Whole query: ' . $query;
    die($message);
}

while ($row = mysql_fetch_assoc($q)) {
echo $row['text'];
}



?>
« Ultima modifica: 02 Giugno 2011, 01:53:51 CEST da Ricky` »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ListView pulling data from MYSQL
« Risposta #3 il: 02 Giugno 2011, 01:55:27 CEST »
+1
Di solito si usa JSON perchè è leggero e facile da parsare ma nessuno ti vieta di usare un altro formato che stabilisci tu.

PS: Visto che il tuo codice php è vulnerabile alle sql-injection ho rimosso l'indirizzo dello script dal post.

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:ListView pulling data from MYSQL
« Risposta #4 il: 02 Giugno 2011, 10:13:54 CEST »
0
Ok, grazie. Solo una cosa non ho ben capito: come faccio a gestire l'output di JSON ed inserirlo nelle ListView?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:ListView pulling data from MYSQL
« Risposta #6 il: 03 Giugno 2011, 11:50:24 CEST »
0
Ok, ci sono. L'unica cosa che non riesco ancora a fare è come inserire il campo name all'interno di un ArrayAdapter.


PARSING:

Codice (Java): [Seleziona]
String name;
                try{
                      jArray = new JSONArray(result);
                      JSONObject json_data=null;
                      for(int i=0;i<jArray.length();i++){
                          json_data = jArray.getJSONObject(i);
                          name=json_data.getString("name");
                      }
                }catch(JSONException e1){
                      Toast.makeText(getBaseContext(), "No Food Found" ,
                                     Toast.LENGTH_LONG).show();
                } catch (ParseException e1) {
                      e1.printStackTrace();
                }


                       
                       
               
               
                // first tab
                TabSpec ts = myTabHost.newTabSpec("TAB_TAG_1");
                ts.setIndicator("Available quiz",
                                rs.getDrawable(R.drawable.quiz_selected));
                ts.setContent(new TabHost.TabContentFactory() {

                        public View createTabContent(String tag) {
                               
                        /*      ArrayList<String> appAL = new ArrayList<String>(50);
                                String stringaInizio = ";";
                                String stringaFine = ";";
                                appAL = fullArrayInt(appoggio, stringaInizio, stringaFine);*/


                                ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                                                MainMenuActivity.this,
                                                android.R.layout.simple_list_item_1, (qui dentro credo vada l'output JSON ma non so cosa dichiarare));

                                ls1.setTextFilterEnabled(true);
                                ls1.setAdapter(adapter);
       
                                return ls1;

                        }

                });
                myTabHost.addTab(ts);

Cosa ne pensi?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ListView pulling data from MYSQL
« Risposta #7 il: 03 Giugno 2011, 12:18:04 CEST »
0
L'idea è che ti crei una ArrayList dove ogni posizione contiene l'elemento che deve essere visualizzato nella riga e poi lo passi all'adapter ;)

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:ListView pulling data from MYSQL
« Risposta #8 il: 03 Giugno 2011, 18:24:11 CEST »
0
Potresti darmi un esempio?  :-o

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ListView pulling data from MYSQL
« Risposta #9 il: 03 Giugno 2011, 19:02:22 CEST »
0
Codice (Java): [Seleziona]
ArrayList<String> strings = new ArrayList<String>();
for(int i=1; i<=10; i++);
        strings.add("Sono la riga "+ i);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainMenuActivity.this, android.R.layout.simple_list_item_1, strings);

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:ListView pulling data from MYSQL
« Risposta #10 il: 06 Giugno 2011, 15:39:43 CEST »
0
Sono una capra.. non riesco a capirci nulla.

Codice: [Seleziona]
try{
                      jArray = new JSONArray(result);
                      JSONObject json_data=null;
                      for(int i=0;i<jArray.length();i++){
                              json_data = jArray.getJSONObject(i);
                          ArrayList<String> strings = new ArrayList<String>();
                              strings.add("Il testo del quiz è: "+ i);                                 
                      }
                 
                }catch(JSONException e1){
                      Toast.makeText(getBaseContext(), "Nessun quiz trovato" ,
                                     Toast.LENGTH_LONG).show();
                } catch (ParseException e1) {
                      e1.printStackTrace();
                }
                           
               
               
                setListAdapter(new ArrayAdapter<String>(this,
                                android.R.layout.simple_list_item_1,
                                strings)); //qui mi da errore.
                               

Sicuramente non so dove mettere il ciclo for se all'interno del parsing JSON o da qualche altra parte.. Scusami ma sono davvero alle prime armi.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ListView pulling data from MYSQL
« Risposta #11 il: 06 Giugno 2011, 15:41:49 CEST »
0
Hai visto il mio codice? L'ArrayList va creato fuori dal ciclo! Anche perchè se lo crei un quello statement la sua visibilità sarà limitata al solo statement.

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:ListView pulling data from MYSQL
« Risposta #12 il: 06 Giugno 2011, 15:43:40 CEST »
0
certo che l'ho visto, ma nel for non dovrei passargli l'indice (cioè il campo "name") ottenuto dal precedente for nel Json?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ListView pulling data from MYSQL
« Risposta #13 il: 06 Giugno 2011, 16:06:25 CEST »
0
Codice (Java): [Seleziona]
 ArrayList<String> strings = new ArrayList<String>();
 try{
                      jArray = new JSONArray(result);
                      JSONObject json_data=null;
                      for(int i=0;i<jArray.length();i++){
                              json_data = jArray.getJSONObject(i);
                              strings.add("Il testo del quiz è: "+ i);                                  
                      }
                 
                }catch(JSONException e1){
                      Toast.makeText(getBaseContext(), "Nessun quiz trovato" ,
                                     Toast.LENGTH_LONG).show();
                } catch (ParseException e1) {
                      e1.printStackTrace();
                }
                           
               
               
                setListAdapter(new ArrayAdapter<String>(this,
                                android.R.layout.simple_list_item_1,
                                strings)); //qui mi da errore.
                                               

Offline Andre

  • Utente junior
  • **
  • Post: 62
  • Respect: +1
    • Mostra profilo
Re:ListView pulling data from MYSQL
« Risposta #14 il: 06 Giugno 2011, 16:11:57 CEST »
0
Ok, provo