Autore Topic: Ottenere dati da un database mysql  (Letto 973 volte)

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 316
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Ottenere dati da un database mysql
« il: 10 Febbraio 2015, 16:56:50 CET »
0
Salve a tutti!

Sto provando a creare un'app che chiede dei dati ad un database mysql online e che li mostra in una ListView.

Seguendo questo tutorial che ho trovato:http://codeoncloud.blogspot.com.es/2013/07/android-mysql-php-json-tutorial.html
va tutto bene, riesco ad ottenere i dati correttamente e a visualizzarli.
Ma quando passo al mio database il logcat mi dice questo:
Codice: [Seleziona]
02-10 15:41:13.402    5212-5212/com.parrucchieribase.adorni.mysqlandroid E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
            at org.json.JSONTokener.nextValue(JSONTokener.java:94)
            at org.json.JSONObject.<init>(JSONObject.java:154)
            at org.json.JSONObject.<init>(JSONObject.java:171)
            at com.parrucchieribase.adorni.mysqlandroid.MainActivity.ListDrwaer(MainActivity.java:98)
            at com.parrucchieribase.adorni.mysqlandroid.MainActivity$JsonReadTask.onPostExecute(MainActivity.java:83)
            at com.parrucchieribase.adorni.mysqlandroid.MainActivity$JsonReadTask.onPostExecute(MainActivity.java:43)
            at android.os.AsyncTask.finish(AsyncTask.java:631)
            at android.os.AsyncTask.access$600(AsyncTask.java:177)
            at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)

posto anche il mio .class:
Codice (Java): [Seleziona]
public class MainActivity extends Activity {
    private String jsonResult;
    private String url = "http://127.0.0.1/my%20portable%20files/Ricevo3.php";
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.listView1);
        accessWebService();
    }

    // Async Task to access the web
    private class JsonReadTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(params[0]);
            try {
                HttpResponse response = httpclient.execute(httppost);
                jsonResult = inputStreamToString(
                        response.getEntity().getContent()).toString();
            }

            catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        private StringBuilder inputStreamToString(InputStream is) {
            String rLine = "";
            StringBuilder answer = new StringBuilder();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));

            try {
                while ((rLine = rd.readLine()) != null) {
                    answer.append(rLine);
                }
            }

            catch (IOException e) {
                // e.printStackTrace();
                Toast.makeText(getApplicationContext(),
                        "Error..." + e.toString(), Toast.LENGTH_LONG).show();
            }
            return answer;
        }

        @Override
        protected void onPostExecute(String result) {
            ListDrwaer();
        }
    }// end async task

    public void accessWebService() {
        JsonReadTask task = new JsonReadTask();
        // passes values for the urls string array
        task.execute(new String[] { url });
    }

    // build hash set for list view
    public void ListDrwaer() {
        List<Map<String, String>> employeeList = new ArrayList<Map<String, String>>();

        try {
            JSONObject jsonResponse = new JSONObject(jsonResult);
            JSONArray jsonMainNode = jsonResponse.optJSONArray("prova");

            for (int i = 0; i < jsonMainNode.length(); i++) {
                JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
                String name = jsonChildNode.optString("name");
                String number = jsonChildNode.optString("number");
                String outPut = name + "-" + number;
                employeeList.add(createEmployee("prova", outPut));
            }
        } catch (JSONException e) {
            Toast.makeText(getApplicationContext(), "Error" + e.toString(),
                    Toast.LENGTH_SHORT).show();
        }

        SimpleAdapter simpleAdapter = new SimpleAdapter(this, employeeList,
                android.R.layout.simple_list_item_1,
                new String[] { "prova" }, new int[] { android.R.id.text1 });
        listView.setAdapter(simpleAdapter);
    }

    private HashMap<String, String> createEmployee(String name, String number) {
        HashMap<String, String> employeeNameNo = new HashMap<String, String>();
        employeeNameNo.put(name, number);
        return employeeNameNo;
    }
}

posso capire che il problema è che si ritrova con un valore nulla in questa riga di codice:
Codice (Java): [Seleziona]
JSONObject jsonResponse = new JSONObject(jsonResult);
ma quando faccio la prova direttamente con la pagina php mi appaiono a "schermo" i valori corretti del mandati tramite eco del json.

Questo è il php che uso:
Codice: [Seleziona]
<?php
$host="localhost"; //replace with database hostname
$username="root"; //replace with database username
$password=""; //replace with database password
$db_name="prova"; //replace with database name
 
$con=mysqli_connect("$host", "$username", "$password","$db_name")or die("cannot connect");
$sql = "select * from prova";
$result = mysqli_query($con,$sql);
$json = array();
 
if(mysqli_num_rows($result)){
while($row=mysqli_fetch_assoc($result)){
$json['prova'][]=$row;
}
}
mysqli_close($con);
echo json_encode($json);
?>

per fare le prove uso easyphp, è possibile che mi torni null perché il database non è "online"?

Grazie mille in anticipo per i suggerimenti!

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Ottenere dati da un database mysql
« Risposta #1 il: 10 Febbraio 2015, 20:09:37 CET »
0
Il mio consiglio spassionato è di non fare le richieste http a mano, ma usare una libreria che le fa per te.

In un'app dimostrativa ho usato okhttp e easyphp per reperire un JSON e in pratica si risolve tutto in poche righe (per leggibilità ho tolto un po' controlli e try catch):

Codice (Java): [Seleziona]
// compongo URL della request
Request request = new Request.Builder().url(baseUrl+"&page=msg&max="+max).build();
// eseguo la chiamata
Response response = client.newCall(request).execute();
// riempio l'array JSON
JSONArray ja = new JSONArray(response.body().string());
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 316
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Ottenere dati da un database mysql
« Risposta #2 il: 12 Febbraio 2015, 10:37:42 CET »
0
ok cerco qualche tutorial e mi studio un po il codice.
Intanto ho provato a migliorare un po il codice ed ora con questo codice:
Codice (Java): [Seleziona]
 String result = "";
        String stringaFinale = "";
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        InputStream is = null;

        //http post
        try {

            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httpost = new HttpPost(url);
            httpost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httpost);
            HttpEntity entity = response.getEntity();

            is = entity.getContent();

            Log.i("test", response.toString());
            Log.i("test2", is.toString());

        }catch(Exception e){
            Log.e("TEST", "Errore nella connessione http "+e.toString());
        }

        if(is != null){
            //converto la risposta in stringa
            try{
                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();
                System.out.println(result.length());
            }catch(Exception e){
                Log.e("TEST", "Errore nel convertire il risultato "+e.toString());
            }
            System.out.println(result);

            if((!result.isEmpty())&&(result.length()>5)){
                //parsing dei dati arrivati in formato json
                try{
                    Log.i("test", "entrato");
                    JSONArray jArray = new JSONArray(result);
                    for(int i=0;i<jArray.length();i++){
                        JSONObject json_data = jArray.getJSONObject(i);
                       // Log.i("TEST","codice: "+json_data.getString("Codice")+
                       //         ", descrizione: "+json_data.getString("Descrizione")+
                       //         ", giacenza: "+json_data.getInt("Giacenza"));

                      /*  Finale =json_data.getString("Codice")+
                                "@" + json_data.getString("Descrizione")+
                                "@"+json_data.getString("Fornitore")+
                                "@"+json_data.getString("Codice Fornitore")+
                                "@"+json_data.getDouble("Giacenza")+
                                "@"+json_data.getString("Giacenza Minima")+
                                "@"+json_data.getString("Prezzo")+
                                "@"+json_data.getString("Valore")+
                                "@"+json_data.getString("Quantità Ordinata")+
                                "@"+json_data.getString("Data Consegna")+
                                "@"+json_data.getString("Giacenza Simulata")+
                                "@"+json_data.getString("Produrre")+
                                "@"+json_data.getString("data_ins")+
                                "@"+json_data.getString("data_mod")+"\n\n";*/

                        flag=1;

                    }

                }
                catch(JSONException e){
                    Log.e("log_tag", "Error parsing data "+e.toString());
                }
            }else{
                System.out.println("ERROR1");

            }
        }
        else{//is è null e non ho avuto risposta
            System.out.println("ERROR2");

        }
        System.out.println("ERROR3");

        return stringaFinale;

mi torna questo catch dal logcat:
Codice: [Seleziona]
02-12 09:32:21.762    1733-1733/com.parrucchieribase.adorni.mysqlandroid E/TEST﹕ Errore nella connessione http org.apache.http.conn.HttpHostConnectException: Connection to http://127.0.0.1 refused

consigli?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Ottenere dati da un database mysql
« Risposta #3 il: 12 Febbraio 2015, 12:45:43 CET »
0
hai messo il permesso INTERNET nell'app?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 316
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Ottenere dati da un database mysql
« Risposta #4 il: 12 Febbraio 2015, 13:24:18 CET »
0
Si si, ho anche messo il permesso per controllare se ha la connessione, faccio anche il controllo della connessione ad internet e va tutto bene.

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
Re:Ottenere dati da un database mysql
« Risposta #5 il: 12 Febbraio 2015, 14:08:08 CET »
0
ma il php funziona correttamente??(se provi a conneterti dal browser internet)

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 316
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Ottenere dati da un database mysql
« Risposta #6 il: 12 Febbraio 2015, 14:20:11 CET »
0
si funziona correttamente da browser, mi manda a video il risultato dell query (foto in allegato).

Però ho trovato questo link:http://stackoverflow.com/questions/22660452/org-apache-http-conn-httphostconnectexception-connection-to-http-127-0-0-1-re

che rappresenta perfettamente la mia situazione, non mi resta che mettere il db con il php su un'altro computer o un server online e provare.

Altrimenti potrebbe essere il firewall del mio pc che blocca la richiesta?

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
Re:Ottenere dati da un database mysql
« Risposta #7 il: 12 Febbraio 2015, 14:35:26 CET »
0
si funziona correttamente da browser, mi manda a video il risultato dell query (foto in allegato).

Però ho trovato questo link:http://stackoverflow.com/questions/22660452/org-apache-http-conn-httphostconnectexception-connection-to-http-127-0-0-1-re

che rappresenta perfettamente la mia situazione, non mi resta che mettere il db con il php su un'altro computer o un server online e provare.

Altrimenti potrebbe essere il firewall del mio pc che blocca la richiesta?

per connetterti da android al tuo pc non devi mettere come indirizzo 127.0.0.1.

stau usando l'emulatore??

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 316
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Ottenere dati da un database mysql
« Risposta #8 il: 12 Febbraio 2015, 14:50:40 CET »
0
per ora si uso l'emulatore
ho provato a mettere questo indirizzo :http://10.0.2.2/Ricevo3.php

ma finisce in un "loop infinito" e non mi da alcun risultato o errore, ho provata con il debug e va in loop quando esegue la richiesta http

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
Re:Ottenere dati da un database mysql
« Risposta #9 il: 12 Febbraio 2015, 14:52:48 CET »
0
eppure quello e l'indirizzo corretto..bisognerebbe vedere dove si trova il problema..ma la soluzione e usando 10.0.2.2 non 127.0.0.1

Offline ValerioAdo

  • Utente normale
  • ***
  • Post: 316
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ascend g525
  • Sistema operativo:
    windows 8.1
Re:Ottenere dati da un database mysql
« Risposta #10 il: 12 Febbraio 2015, 16:04:08 CET »
0
Ho riprovato ancora una volta con emulatore ed indirizzo 10.0.2.2  ma finisce sempre in loop, appena posso provo a mettere il php ed il database su un database online oppure su un diverso pc.

Post unito: 13 Febbraio 2015, 10:06:44 CET
Ho provato ad usare l'indirizzo http://10.0.2.2:8080/Ricevo3.php sul browser ma mi dici che la pagina web non è disponibile....

teoricamente sto usando la porta 8080 ma come faccio a vedere se sto usando proprio quella?
« Ultima modifica: 13 Febbraio 2015, 10:06:49 CET da ValerioAdo, Reason: Merged DoublePost »