Autore Topic: problemi nel collegare android a mysql/php  (Letto 1087 volte)

Offline daniweb

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    galaxy s2
  • Sistema operativo:
    windows 7
problemi nel collegare android a mysql/php
« il: 07 Novembre 2012, 11:30:17 CET »
0
Ciao a tutti,
sto provando ad effettuare uno scambio dati tra mysql e android.
tra le varie guide ne ho trovata una che permette di inviare tramite httpPost i dati ad una pagina web e recuperare i dati in formato Json.

ho fatto diverse prove ma il LogCat mi restituisce sempre un errore
11-07 10:59:41.140: E/log_tag(3787): Error in http connection android.os.NetworkOnMainThreadException

vi posto il codice che attualmente utilizzo.
Codice (Java): [Seleziona]
import my.app.Test.R;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

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.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;



import android.app.ListActivity;
import android.net.ParseException;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;


public class Importa extends ListActivity
{
        JSONArray jArray;
        String result = null;
        InputStream is = null;
        StringBuilder sb=null;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                //http post
                try{
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost("myUrl");
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                        is = entity.getContent();
                }catch(Exception e){
         Log.e("log_tag", "Error in http connection: "+e.toString());
                }
                //convert response to string
                try{
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                        sb = new StringBuilder();
                        sb.append(reader.readLine() + "\n");

                        String line="0";
                        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());
        }
                //paring data
                try{
                        jArray = new JSONArray(result);
                        JSONObject json_data=null;
                        for(int i=0;i<jArray.length();i++){
                                json_data = jArray.getJSONObject(i);
                                int ct_id=json_data.getInt("id");
                                String ct_name=json_data.getString("nome");
                        }
                }
                catch(JSONException e1){
                        Toast.makeText(getBaseContext(), "No City Found" ,Toast.LENGTH_LONG).show();
                } catch (ParseException e1) {
                        e1.printStackTrace();
                }
        }
}

myUrl è un indirizzo pubblico che mi son fatto prestare e che se copio e incollo sul browser mi ritorna correttamente la stringa Json

il LogCat ritorna questo errore:

11-07 11:20:36.740: E/log_tag(4178): Error in http connection: android.os.NetworkOnMainThreadException
11-07 11:20:36.740: E/log_tag(4178): Error converting result java.lang.NullPointerException
11-07 11:20:40.490: E/AndroidRuntime(4178): FATAL EXCEPTION: main
11-07 11:20:40.490: E/AndroidRuntime(4178): java.lang.RuntimeException: Unable to start activity ComponentInfo{my.app.Test/my.app.Test.impexp.Importa}: java.lang.NullPointerException
11-07 11:20:40.490: E/AndroidRuntime(4178):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1751)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at android.app.ActivityThread.access$1500(ActivityThread.java:122)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at android.os.Looper.loop(Looper.java:132)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at android.app.ActivityThread.main(ActivityThread.java:4028)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at java.lang.reflect.Method.invokeNative(Native Method)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at java.lang.reflect.Method.invoke(Method.java:491)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at dalvik.system.NativeStart.main(Native Method)
11-07 11:20:40.490: E/AndroidRuntime(4178): Caused by: java.lang.NullPointerException
11-07 11:20:40.490: E/AndroidRuntime(4178):    at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:112)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at org.json.JSONTokener.nextValue(JSONTokener.java:90)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at org.json.JSONArray.<init>(JSONArray.java:87)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at org.json.JSONArray.<init>(JSONArray.java:103)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at my.app.Test.impexp.Importa.onCreate(Importa.java:70)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
11-07 11:20:40.490: E/AndroidRuntime(4178):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715)
11-07 11:20:40.490: E/AndroidRuntime(4178):    ... 11 more


inizialmente avevo un errore di permission che ho risolto settando i permessi nell'androidManifest
purtroppo quasi tutti i tutorial si basano su server locale e device virtuale.
purtroppo il mio pc è un po piccolo e solo con eclipse, un device virtuale impiega dai 10 ai 20 minuti ad avviarsi e crasha per mancanza di risorse... quindi io starei facendo i test con un galaxy tab ed un server remoto, come dicevo l'indirizzo web è quello di un amico che mi ha fatto la cortesia di caricare una tabella sul suo db e un file per estrapolare i dati.
quando provo ad interrogare la pagina il risultato a video tramite browser è questo:

[{"id":"1","nome":"Mario"},{"id":"2","nome":"Luigi"},{"id":"3","nome":"Gianluca"},{"id":"4","nome":"Francesco"},{"id":"5","nome":Luca"},{"id":"6","nome":"Simone"},{"id":"7","nome":"Mauro"}]

sapreste consigliarmi o aiutarmi?
grazie

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:problemi nel collegare android a mysql/php
« Risposta #1 il: 07 Novembre 2012, 11:41:15 CET »
0
Hai preso in considerazione di cercare sul forum e qui su google l'errore "android.os.NetworkOnMainThreadException"? Ci sono numerosi thread che trattano l'argomento.

Offline daniweb

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    galaxy s2
  • Sistema operativo:
    windows 7
Re:problemi nel collegare android a mysql/php
« Risposta #2 il: 08 Novembre 2012, 11:42:03 CET »
0
ciao, perdona la mia capraggine. ho fatto come giustamente mi hai detto ed ho capito qualcosa in più.
tra le varie ho trovato un tutorial fatto da bradipao sul recupero dei dati.

fino a che ho seguito quelle indicazioni è andato tutto a meraviglia.
poi ho dovuto modificare alcune parti perchè in quel tutorial veniva spiegato come leggere un xml mentre io devo leggere una string json
ho cercato di unificare il mio vecchio codice con quello del tutorial ma il risultato non è stato dei migliori.
continuo ad avere un errore
11-08 11:14:37.789: E/AndroidRuntime(4438): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()


mentre scrivevo ho risolto quasi tutto.
l'unica cosa è che non riesco ad ottenere risultati multipli
 posto il codice e poi spiego.
Codice (Java): [Seleziona]
public class HttpBookSearch extends Activity {

   // vars
        JSONArray jArray;
        int nbook=0;
        String result=null;
        HttpClient httpclient=null;
        String title="",author="",link="";
        InputStream is = null;
        StringBuilder sb=null;
        HttpResponse response=null;
   
   // views
   private ProgressDialog pd;
   private Button btnGet,btnLink;
   private EditText editIsbn;
   private TextView txtTitle,txtAuthor,txtDebug;
   
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.importexport);
     
      // imposto le views
      btnGet = (Button)findViewById(R.id.btnGet);
      editIsbn = (EditText)findViewById(R.id.editIsbn);
      txtTitle = (TextView)findViewById(R.id.txtTitle);
      txtAuthor = (TextView)findViewById(R.id.txtAuthor);
      btnLink = (Button)findViewById(R.id.btnLink);
      txtDebug = (TextView)findViewById(R.id.txtDebug);
     
      // listener del button GET
      OnClickListener mGetListener = new OnClickListener() {
         public void onClick(View v) {
            // inizializzo textview di debug
            txtDebug.setText("Application Started");
            // creo una progress dialog
            pd = ProgressDialog.show(HttpBookSearch.this,"rirpistino dati","Collegamento...",true,false);
            // creo e avvio asynctask se c'è rete
            ConnectivityManager connMgr = (ConnectivityManager)
            getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isConnected()) {
                HttpGetTask task = new HttpGetTask();
                task.execute(editIsbn.getText().toString());
            } else {
                pd.dismiss();
                ProgressDialog.show(HttpBookSearch.this,"Rilevamento rete","Nessuna connessione di rete disponibile",true,true);
            }            
         }
      };
      btnGet.setOnClickListener(mGetListener);

      // listener del button LINK
      OnClickListener mLinkListener = new OnClickListener() {
         public void onClick(View v) {
            // creo l'intent
            Intent viewIntent = new Intent("android.intent.action.VIEW", Uri.parse(link));
            // avvio l'activity
            startActivity(viewIntent);
         }
      };
      btnLink.setOnClickListener(mLinkListener);
     
   }
   
   // my AsyncTask
   private class HttpGetTask extends AsyncTask<String,String,String>  {

      @Override
      protected String doInBackground(String... params) {

         result = null;
         
         // interrogazione del web service
         try {
           
            // aggiorno la progress dialog
            publishProgress("collegamento al database...");
           
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost("http://myip/test.php");
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        response = httpclient.execute(httppost);       

         } catch (HttpResponseException e) {
            // gestisce le risposte diverse da HTTP code 200
            Log.w("MyApp","HTTP Response Exception : "+e.toString());
         } catch (Exception e) {
            Log.w("MyApp","Error : "+e.toString());
         } finally {
            if (httpclient != null) httpclient.getConnectionManager().shutdown();
         }
       
      if (response!=null) try {
       
                        HttpEntity entity = response.getEntity();
                        is = entity.getContent();
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                        sb = new StringBuilder();
                        sb.append(reader.readLine() + "\n");

                        String line="0";
                        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());
         }        
               
                ///FINE PARTE COPIATA
         
         return result;
         
      }

      @Override
      protected void onProgressUpdate(String... values) {
         // aggiorno la progress dialog
         pd.setMessage(values[0]);
      }

      @Override
      protected void onPostExecute(String result) {
         // chiudo la progress dialog
         
         Log.e("log_tag", "trovato: "+result);
         //paring data
                try{
                        jArray = new JSONArray(result);
                        JSONObject json_data=null;
                        for(int i=0;i<jArray.length();i++){
                                json_data = jArray.getJSONObject(i);
                                Log.e("log_tag", "trovato id: "+json_data.getInt("id"));
                                Log.e("log_tag", "trovato nome: "+json_data.getString("nome"));
                                int ct_id=json_data.getInt("id");
                                String ct_name=json_data.getString("azienda");
                        }
                        pd.dismiss();
                }
                catch(JSONException e1){
                        Toast.makeText(getBaseContext(), "Nessun dato trovato" ,Toast.LENGTH_LONG).show();
                } catch (ParseException e1) {
                        e1.printStackTrace();
                }
      }
   }
}

usando LogCat ho visto che la stringa Json arriva completa.
Codice (Java): [Seleziona]
11-08 11:30:51.119: E/log_tag(4823): trovato: [{"id":"1","nome":"Mario},{"id":"2","nome":"Luigi"},{"id":"3","nome":"Gianluca"},{"id":"4","nome":"Francesco"},{"id":"5","nome":"Luca"},{"id":"6","nome":"Silvia"},{"id":"7","nome":"Marta"},{"id":"8","nome":"Stefania"},{"id":"9","nome":"Valentina]
con questa portzione di codice
Codice (Java): [Seleziona]
jArray = new JSONArray(result);
                        JSONObject json_data=null;
                        for(int i=0;i<jArray.length();i++){
                                json_data = jArray.getJSONObject(i);
                                Log.e("log_tag", "trovato id: "+json_data.getInt("id"));
                                Log.e("log_tag", "trovato nome: "+json_data.getString("nome"));
                                int ct_id=json_data.getInt("id");
                                String ct_name=json_data.getString("azienda");
                        }
mi aspettavo che venisse generato un array e stampato ogni risultato.
invece mi stampa solo il primo.
Codice (Java): [Seleziona]
11-08 11:30:51.139: E/log_tag(4823): trovato id: 1
11-08 11:30:51.139: E/log_tag(4823): trovato nome: Mario
11-08 11:31:00.029: E/TODmobile(586): onReceive action=android.intent.action.TIME_TICK
11-08 11:31:00.029: E/TODmobile(586): hour : 11    minute : 31
11-08 11:31:00.029: E/DigitalClockWidget(586): updateWidgets
11-08 11:31:00.029: E/TODmobile(586): hour : 11    minute : 31

riusciureste a darmi qualche consiglio o indicarmi la via giusta?
nel frattempo continuo a cercare di capire la guida ufficiale.
grazie.

Offline daniweb

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    galaxy s2
  • Sistema operativo:
    windows 7
Re:problemi nel collegare android a mysql/php
« Risposta #3 il: 08 Novembre 2012, 12:03:19 CET »
0
ciao,
ho capito dove sta il problema .....
Codice (Java): [Seleziona]
for(int i=0;i<jArray.length();i++){
                                json_data = jArray.getJSONObject(i);
                                Log.e("log_tag", "trovato id: "+json_data.getInt("id"));
                                Log.e("log_tag", "trovato nome: "+json_data.getString("nome"));
                        }
rimuovendo le righe
String ct_name=json_data.getString("azienda");
il mio array non contiene alcuna chiave "azienda" ma  "id" e "nome".
una volta sostituita la stringa tutto è andato a posto.


domandona.
tutto questo io lo sto facendo perchè vorrei leggere e importare in android i dati di un DB di un sito.
mi sono reso conto che in questo modo io potrei importare i dati di una tabella.
ma come potrei fare se le tabelle nel mio db mysql sono 10?

Offline daniweb

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    galaxy s2
  • Sistema operativo:
    windows 7
Re:problemi nel collegare android a mysql/php
« Risposta #4 il: 09 Novembre 2012, 20:40:50 CET »
0
continuo con le mie "scoperte dell'acqua calda" :-P

come ho scritto sto cercando di ottenere un sistema per trasportare tutto il db sqllite su  mysql web remoto e viceversa.
ho letto vari articoli a riguardo, alcuni parlano di json, alrti di installare librerie sulla app di android.
molti parlano di collegamenti locali  oppure di trasferire singole righe di una tabella.
o forse sono semplicemente io che per vari motivi non ho capito di quello che parlavano.

sta di fatto che sono giunto ad una soluzione ma vorrei un vostro consiglio barra parere.

in pratica per trasferire l'intero DB sqllite sto utilizzando Json

questo è la porzione di codice che sto utilizzando.
Codice (Java): [Seleziona]
// aggiorno la progress dialog
            publishProgress("collegamento al database...");          
           
            // crea un httpclient e header post
            HttpClient httpclient = new DefaultHttpClient();                      
                        HttpPost httppost = new HttpPost("myurl/test.php");
                       
                        // aggiungi dati
                        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                        nameValuePairs.add(new BasicNameValuePair("serial", idSerial));
projectCursor = mDbHelper.fetchAllProgetti();
                        JSONObject jsonProject = new JSONObject();  
                        JSONArray jsonArrProject = new JSONArray();
                        if (projectCursor.getCount()>0)
                {                              
                        projectCursor.moveToFirst();
                        do {                           
                                jsonProject.put("id", projectCursor.getString(projectCursor.getColumnIndexOrThrow(ProgettoTable.COLS1)));
                                jsonProject.put("nome", projectCursor.getString(projectCursor.getColumnIndexOrThrow(ProgettoTable.COLS2)));
                                jsonProject.put("via", projectCursor.getString(projectCursor.getColumnIndexOrThrow(ProgettoTable.COLS3)));
                                Log.e("json ogject","dato: "+jsonProject.toString());
                                jsonArrProject.put(jsonProject);
                        } while (projectCursor.moveToNext());
                       
                }                      
                        nameValuePairs.add(new BasicNameValuePair("progetto", jsonArrProject.toString()  ));

                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                        response = httpclient.execute(httppost);

il database potrebbe essere composto da un numero di righe che va dalle 20 alle 100 probabilmente.
Json va bene un un tale quantitativo?
è consigliabile usare un'altro metodo?

grazie e scusate se continuo a rompervi le scatole con le mie domande :)

Offline daniweb

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    galaxy s2
  • Sistema operativo:
    windows 7
Re:problemi nel collegare android a mysql/php
« Risposta #5 il: 19 Novembre 2012, 18:18:53 CET »
0
non va :(


qualcuno saprebbe consigliarmi?
Codice (Java): [Seleziona]
JSONObject jsonProject = new JSONObject();  
                        JSONArray jsonArrProject = new JSONArray();
                        if (projectCursor.getCount()>0)
                {                              
                        projectCursor.moveToFirst();
                        do {                            
                                jsonProject.put("id", projectCursor.getString(projectCursor.getColumnIndexOrThrow(ProgettoTable.COLS1)));
                                jsonProject.put("nome", projectCursor.getString(projectCursor.getColumnIndexOrThrow(ProgettoTable.COLS2)));
                                jsonProject.put("via", projectCursor.getString(projectCursor.getColumnIndexOrThrow(ProgettoTable.COLS3)));
                                Log.e("json ogject","dato: "+jsonProject.toString());
                                jsonArrProject.put(jsonProject);
                        } while (projectCursor.moveToNext());
                       
                }                      
                        nameValuePairs.add(new BasicNameValuePair("progetto", jsonArrProject.toString()  ));
quello che non va è jsonarray ma non capisco perchè...

in pratica ho un cursor (projectCursor)
a quel punto mi muovo sulla prima riga (projectCursor.moveToFirst();)

assegno all'oggetto jsonProject i valori contenuti nella riga (jsonProject.put(....)  )

quindi inserisco l'oggetto json (jsonProject ) nell' array Json (jsonArrProject)  ( jsonArrProject.put(jsonProject); )

quindi mi sposto sulla seconda riga  e ripeto il ciclo.

quello che mi aspettavo era :
[{"id":"1", "nome":"PROVA1","via":"INDIRIZZO, 1"}, {"id":"2", "nome":"PROVA2","via":"INDIRIZZO, 2"}]

e invece mi trovo una duplicazione della seconda riga
11-19 17:48:58.370: E/json ogject(3472): oggetto progetto [{"id":"2", "nome":"PROVA2","via":"INDIRIZZO, 2"}, {"id":"2", "nome":"PROVA2","via":"INDIRIZZO, 2"}]

se guardo il log Log.e("json ogject","dato: "+jsonProject.toString());
mi stampa
11-19 17:48:58.340: E/json ogject(3472): dato: [{"id":"1", "nome":"PROVA1","via":"INDIRIZZO, 1"}]
11-19 17:48:58.350: E/json ogject(3472): dato: [{"id":"2", "nome":"PROVA2","via":"INDIRIZZO, 2"}]

quindi il ciclo lo esegue giusto.

sicuramente è qualcosa che ho sbagliato nell'utilizzare o capire l'utilizzo del JSONArray


mi potreste aiutare?
grazie.

Offline daniweb

  • Nuovo arrivato
  • *
  • Post: 30
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    galaxy s2
  • Sistema operativo:
    windows 7
Re:problemi nel collegare android a mysql/php
« Risposta #6 il: 19 Novembre 2012, 18:21:59 CET »
0
ok risolto.....

ho spostato

JSONObject jsonProject = new JSONObject(); 
da fuori del do{}while a dentro. in questo modo crea un nuovo oggetto ad ogni ciclo.