Come effettuare query a database MySQL dalla vostra app Android

Amici sviluppatori, per la vostra gioia inauguriamo oggi la categoria “sviluppo”!
In questo primo articolo che vi propongo (spero sia il primo di una lunga serie), vi spiego come effettuare una query ad un database MySQL remoto direttamente dalla vostra applicazione Android.

my sql android php json
Inizialmente ho provato con il driver JDBC, cioè come avevo sempre fatto nelle applicazioni J2SE (Java Standard), dove infatti funziona correttamente sia richiamando un Db locale sia remoto.
Purtroppo per le app Android la strada da seguire è un po più tortuosa, vediamo come:

Innanzitutto dovrete predisporre, lato server, un file PHP che si occuperà di:

  1. prendere in input la query da Java
  2. fare la connessione al database
  3. restituire i risultati in output, sotto forma di file JSON

Ecco un esempio del php che dovrete scrivere:

<?php

mysql_connect("sql.hostmiosito.it:3306","user","password");

mysql_select_db("mio_database");

$q=mysql_query("SELECT * FROM iscritti ");

while($e=mysql_fetch_assoc($q))

        $output[]=$e;

print(json_encode($output));

mysql_close();

?>

Mentre lato Java, ci occuperemo di:

  1. Inviare la query via HTTP alla pagina PhP
  2. Prendere in input tramite la classe BufferedReader lo stream (cioè il file json ricevuto)
  3. Fare il parsing dei dati JSON ricevuti

Ecco un esempio:

publicclassHttpPostActivity extendsActivity {

    @Override
    publicvoidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        finalTextView textviewDatiRicevuti = (TextView) findViewById(R.id.datiRicevuti);
        Button buttonInviaDati = (Button) findViewById(R.id.buttonInviaDati);
        buttonInviaDati.setOnClickListener(newView.OnClickListener() {
            publicvoidonClick(View view) {
                //invio richiesta
                textviewDatiRicevuti.setText(inviaDati());
            }
        });
    }
    publicString inviaDati(){
        String result = "";
        String stringaFinale = "";
        ArrayList<NameValuePair> nameValuePairs = newArrayList<NameValuePair>();
        nameValuePairs.add(newBasicNameValuePair("idnomerichiesto","1"));
        InputStream is = null;
        //http post
        try{
                HttpClient httpclient = newDefaultHttpClient();
                HttpPost httppost = newHttpPost("http://10.1.1.1:3306/miosito/connectDb.php");
                httppost.setEntity(newUrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
        }catch(Exception e){
                Log.e("TEST", "Errore nella connessione http "+e.toString());
        }
        if(is != null){
            //converto la risposta in stringa
            try{
                    BufferedReader reader = newBufferedReader(newInputStreamReader(is,"iso-8859-1"),8);
                    StringBuilder sb = newStringBuilder();
                    String line = null;
                    while((line = reader.readLine()) != null) {
                            sb.append(line + "\n");
                    }
                    is.close();
                    result=sb.toString();
            }catch(Exception e){
                    Log.e("TEST", "Errore nel convertire il risultato "+e.toString());
            }
            //parsing dei dati arrivati in formato json
            try{
                    JSONArray jArray = newJSONArray(result);
                    for(inti=0;i<jArray.length();i++){
                            JSONObject json_data = jArray.getJSONObject(i);
                            Log.i("TEST","id: "+json_data.getInt("id")+
                                    ", cognome: "+json_data.getString("cognome")+
                                    ", nascita: "+json_data.getInt("anno")
                            );
                            stringaFinale = json_data.getInt("id") + " "+ json_data.getString("cognome") + " "+ json_data.getInt("anno") + "\n\n";
                    }
            }
            catch(JSONException e){
                    Log.e("log_tag", "Error parsing data "+e.toString());
            }
        }
        else{//is è null e non ho avuto risposta
        }
        returnstringaFinale;
    }
}

NB: al posto di “http:// 10.1.1.1:3306/ miosito/ connectDb.php" andrete ad inserire l'url del vostro DB MySQL remoto.

Provate e fateci sapere se funziona!

5 pensieri su “Come effettuare query a database MySQL dalla vostra app Android

  1. Scusa la domanda da novizio della programmazione Android, il codice in Java dove devo scriverlo? Io uso Eclipse e l’ho messo in un Activity di un AppAndroid Project vuoto ma mi da tantissimi errori di compilazione..

    • Si anche a me, è perchè bisogno mettere gli spazi (incola tutto male) importare e dichiarare tutto;
      Dopo 1h non sono ancora riuscito a sistemarlo ma speriamo bene🙂

  2. Cioè? Cosa va dichiarato? Le librerie Apache dove le trovo e come faccio ad evitare gli errori

  3. Sono neofita, vorrei sapere anch’io passo passo come procedere.
    Il codice dove va messo?

  4. Domani lo provo. Sono fiducioso.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...