Autore Topic: Visualizzare info profilo da db remoto in base a credenziali login  (Letto 1023 volte)

Offline sarahcvr

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 7
0
Salve a tutti, avrei un problema da sottoporvi che cerco di risolvere da giorni senza successo  :-(

Sto sviluppando un'app che quando viene aperta richiede il login con email e password. Una volta che l'utente ha effettuato il login, tra le altre cose, deve poter accedere ad una scheda "Profilo" contenente tutti i suoi dati (nome, cognome, nascita, ecc..).
Ora, io ho un db su Altervista con le tabelle "users" in cui sono salvati i dati relativi al login (a ogni record corrispondono le credenziali di accesso di un utente) e "profilo" (in cui ogni record contiene i dati relativi a un utente).
Una volta che l'utente ha effettuato il login, l'email e il nome dell'utente vengono salvate sul db SQLite del dispositivo.

Il mio problema è che non riesco a mostrare i dati relativi all'utente specifico in base all'email inserita nel login.

Il file php che uso è il seguente:

Codice: [Seleziona]
<?php
mysql_connect("localhost","mygymapp","");
mysql_select_db("my_mygymapp");
 
$q=mysql_query("SELECT * FROM profilo WHERE email LIKE ".$_REQUEST['email_login']);
while($e=mysql_fetch_assoc($q))
        $output[]=$e;
 
print(json_encode($output));
 
mysql_close();
?>

mentre il metodo che uso per estrarre le informazioni del profilo è questo:

Codice (Java): [Seleziona]
public String inviaDati(){
       
        String result = "";
        String stringaFinale = "";
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("email_login", dbhandler.getUserEmail()));
        InputStream is = null;
 
        //http post
        try{
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://mygymapp.altervista.org/readprofilo.php");
                httppost.setEntity(new UrlEncodedFormEntity(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 = 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("TEST", "Errore nel convertire il risultato "+e.toString());
            }
 
            //parsing dei dati arrivati in formato json
            try{
                    JSONArray jArray = new JSONArray(result);
                    for(int i=0;i<jArray.length();i++){
                            JSONObject json_data = jArray.getJSONObject(i);
                            Log.i("TEST","id_profilo: "+json_data.getInt("id_profilo")+
                                    ", nome: "+json_data.getString("nome")+
                                    ", cognome: "+json_data.getString("cognome")+
                                    ", email: "+json_data.getString("email")+
                                    ", nascita: "+json_data.getString("nascita")+
                                    ", scad_abb: "+json_data.getString("scad_abb")+
                                    ", scad_cm: "+json_data.getString("scad_cm")
                            );
                            stringaFinale = json_data.getString("nome") + " " + json_data.getString("cognome") + " " +json_data.getString("email") + " " + json_data.getString("nascita") + " " + json_data.getString("scad_abb") + " " + json_data.getString("scad_cm") + "\n\n";
                    }
            }
            catch(JSONException e){
                    Log.e("log_tag", "Error parsing data "+e.toString());
            }
        }
        else{//is è null e non ho avuto risposta
 
        }
 
        return stringaFinale;
    }

dove dbhandler.getUserEmail() è una stringa ottenuta da questo metodo:

Codice (Java): [Seleziona]
public String getUserEmail(){
        HashMap<String,String> user = new HashMap<String,String>();
        String selectQuery = "SELECT  * FROM " + TABLE_LOGIN;
         
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        // Move to first row
        cursor.moveToFirst();
        if(cursor.getCount() > 0){
            user.put("name", cursor.getString(1));
            user.put("email", cursor.getString(2));
            user.put("uid", cursor.getString(3));
            user.put("created_at", cursor.getString(4));
        }
        cursor.moveToFirst();
        String userEmail = cursor.getString(2);
        cursor.close();
        db.close();
        // return user
        return userEmail;
    }

Uso il comando cursor.moveToFirst() perché il db locale contiene solo un record, ma non sono sicura che questo metodo sia giusto concettualmente...

Ovviamente questo codice non funziona come speravo. Non capisco però quale sia il problema... Dove sbaglio?

Quello che viene fuori dal LogCat è questo:

FATAL EXCEPTION: main
Process: it.sii.android.mygym, PID: 16088
java.lang.NullPointerException
    at it.sii.android.mygym.ProfiloActivity.inviaDati(ProfiloActivity.java:63)
    at it.sii.android.mygym.ProfiloActivity$1.onClick(ProfiloActivity.java:53)
    at android.view.View.performClick(View.java:4438)
    at android.view.View$PerformClick.run(View.java:18422)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5001)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
    at dalvik.system.NativeStart.main(Native Method)

Confido nella vostra esperienza, sicuramente ne avete molta più di me  :-)

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:Visualizzare info profilo da db remoto in base a credenziali login
« Risposta #1 il: 23 Agosto 2014, 18:21:16 CEST »
0
Citazione
java.lang.NullPointerException
    at it.sii.android.mygym.ProfiloActivity.inviaDati(ProfiloActivity.java:63)
    at it.sii.android.mygym.ProfiloActivity$1.onClick(ProfiloActivity.java:53)

Alle righe 53 e 63 di Profilo Activity qualcosa è null e non dovrebbe esserlo. Visto che solo tu puoi vedere i numeri di riga, verifica nel codice.

Aggiungo un paio di consiglio random:
- proteggi un po' le query mysql dalla SQL-injection
- invece di gestire a mano le richieste http, usa librerie come asynchttpclient o okhttp, risparmi tonnellate di codice e fanno tutto in autonomia allo stato dell'arte
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline sarahcvr

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 7
Re:Visualizzare info profilo da db remoto in base a credenziali login
« Risposta #2 il: 23 Agosto 2014, 18:33:02 CEST »
0
Innanzitutto grazie per la risposta  :-)

La riga 53 si riferisce sempre al metodo inviaDati() :

textviewDatiRicevuti.setText(inviaDati()); 

Mentre la riga 63 è questa (fa parte del codice che ho postato):

nameValuePairs.add(new BasicNameValuePair("email_login", dbhandler.getUserEmail()));

Forse è il metodo getUserEmail() che ha qualcosa che non va? Ammetto di non essere un'esperta di Android e di Java in generale...  :-(

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:Visualizzare info profilo da db remoto in base a credenziali login
« Risposta #3 il: 23 Agosto 2014, 18:36:48 CEST »
0
Mentre la riga 63 è questa (fa parte del codice che ho postato):
nameValuePairs.add(new BasicNameValuePair("email_login", dbhandler.getUserEmail()));
Forse è il metodo getUserEmail() che ha qualcosa che non va? Ammetto di non essere un'esperta di Android e di Java in generale...  :-(

Si, il maggior indiziato è getUserMail().

Per fare "debug" aggiungi subito prima questa riga di codice:
Codice (Java): [Seleziona]
Log.d("TAG","getUserMail = "+dbhandler.getUserEmail());
In questo modo ti ritrovi nel LogCat una riga DEBUG subito prima dell'exception, che ti dice il valore ritornato da getUserMail. Se è null, è in quella direzione che devi indagare. Per esempio andando a mettere Log.d(...) dentro la funzione per scoprire perchè è null.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline sarahcvr

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 7
Re:Visualizzare info profilo da db remoto in base a credenziali login
« Risposta #4 il: 23 Agosto 2014, 19:07:13 CEST »
0
In realtà ci avevo già provato a mettere quel comando, ma non so per quale motivo non me lo mostra nel logcat... Ho provato a scriverlo un po' ovunque, anche in altre activity (così per fare prove a caso) e il risultato è che mi crasha l'app quando provo ad andare sull'activity in cui ho scritto il comando... E' possibile che il solo richiamare il metodo getUserEmail() faccia crashare l'app?  o_O
In ogni caso, a questo punto penso che sia proprio quel metodo il problema! Come posso estrarre la stringa contenente il valore dell'email scritta dall'utente senza combinare questi disastri?

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
Re:Visualizzare info profilo da db remoto in base a credenziali login
« Risposta #5 il: 23 Agosto 2014, 20:17:35 CEST »
0
O forse dbhandler e null per qualche strano motivo

Offline sarahcvr

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 7
Re:Visualizzare info profilo da db remoto in base a credenziali login
« Risposta #6 il: 23 Agosto 2014, 21:12:16 CEST »
0
Allora spero di non aver scritto io una cavolata: nell'activity ho dichiarato la variabile

DatabaseHandler dbhandler;

ma non le ho dato nessun valore... La uso solo per richiamare il metodo getUserEmail() che è dichiarato nella classe DatabaseHandler. Devo inizializzarla in qualche modo prima di usarla?  :-[

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
Re:Visualizzare info profilo da db remoto in base a credenziali login
« Risposta #7 il: 23 Agosto 2014, 22:49:05 CEST »
0
Esatto..altrimenti ha valore null

Offline sarahcvr

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 7
Re:Visualizzare info profilo da db remoto in base a credenziali login
« Risposta #8 il: 23 Agosto 2014, 23:14:35 CEST »
0
Ah ecco  :-[ 
Perdona la domanda stupida, ma che valore posso mettere a questa variabile?

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
Re:Visualizzare info profilo da db remoto in base a credenziali login
« Risposta #9 il: 24 Agosto 2014, 01:16:50 CEST »
0
Questo pero concerne il java non android


Bisogna inizializzarla utilizzando il costruttore della classe. Questo dovrà istanziare tutti i parametri necessari in modo che non ci siano variabili null che vengono utilizzate

Offline sarahcvr

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 7
Re:Visualizzare info profilo da db remoto in base a credenziali login
« Risposta #10 il: 24 Agosto 2014, 11:14:56 CEST »
0
Sì hai perfettamente ragione.. Ora ho inizializzato dbhandler e non mi dà più quell'errore, in più usando il comando che mi ha detto bradipao

Log.d("TAG","getUserMail = "+dbhandler.getUserEmail());

si vede che il metodo getUserEmail() restituisce il risultato corretto.

Adesso però ho un altro tipo di errore:

E/log_tag(21035): Error parsing data org.json.JSONException: Value null of type org.json.JSONObject$1 cannot be converted to JSONArray

Da cosa può dipendere? Comunque grazie mille per l'aiuto che mi state dando!

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
Re:Visualizzare info profilo da db remoto in base a credenziali login
« Risposta #11 il: 24 Agosto 2014, 11:19:52 CEST »
0
sembra che tu usi un json object invece che un json array..ma un logcat completo aiuta a capire la linea precisa in cui si verifica il problem

Offline sarahcvr

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 7
Re:Visualizzare info profilo da db remoto in base a credenziali login
« Risposta #12 il: 24 Agosto 2014, 11:32:27 CEST »
0
Mi dà solo quella riga, anche perché nella parte in cui dovrebbe fare il parsing dei dati metto


            catch(JSONException e){
                    Log.e("log_tag", "Error parsing data "+e.toString());
            }

ma non so se c'è qualcosa di sbagliato prima... Il codice del metodo completo l'ho messo nel primo post comunque

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
Re:Visualizzare info profilo da db remoto in base a credenziali login
« Risposta #13 il: 24 Agosto 2014, 11:38:02 CEST »
0
che possono creare quell'eccezzione dovrebbero essere o

JSONArray jArray = new JSONArray(result);
o
JSONObject json_data = jArray.getJSONObject(i);


anche se dall'errore sembra piu facilmente
JSONArray jArray = new JSONArray(result);


quindi mi sembra che tu in realta ritorno un jsonObject e non un JSONArray e quindi per quel motivo crasha..

se posto un esempio di risposta si dovrebbe capire meglio


Offline sarahcvr

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Windows 7
Re:Visualizzare info profilo da db remoto in base a credenziali login
« Risposta #14 il: 24 Agosto 2014, 12:09:14 CEST »
0
Sai qual è la cosa strana? Che se provo a scrivere, ad esempio:

nameValuePairs.add(new BasicNameValuePair("id", "1"));

cioè se gli dico di stamparmi il record con id=1 non mi dà nessun problema, l'app funziona correttamente. Se invece al posto dell'1 metto dbhandler.getUserEmail() mi dà l'errore che ti dicevo... Non so se sai cosa possa significare, io lo dico per completezza di informazioni, non si sa mai!

Comunque alla fine di tutto dovrebbe uscire fuori una stringa del tipo "Nome Cognome Email Nascita ScadenzaAbbonamento ScadenzaCertificato" ad esempio "Franco Rossi franco.rossi@xxx.com 1989-05-30 2014-10-23 2014-10-21"... Era questo che volevi sapere?