Autore Topic: Query su DB per dati in listview,aiutatemi a capire  (Letto 531 volte)

Offline TheWhiteWolf

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung SGS3
  • Sistema operativo:
    Ubuntu 12.04 / Win 7
Query su DB per dati in listview,aiutatemi a capire
« il: 02 Maggio 2013, 21:12:19 CEST »
0
Buonasera,intanto inizio che da coloro che mi aiuteranno,vorrei delle tracce per riuscire a capire come viene gestita la query SQL e quindi l'estrazione dei dati,non voglio codice pronto all'uso altrimenti non imparerò mai.

Per inciso dico che vengo da una discreta conoscenza di PHP e gestione di database MySql con lo stesso,quindi non sono nuovo all'ambiente database di per se,ma sicuramente mi ritengo un novello per quanto riguarda java,ma veniamo al sodo:

Questa la classe che mi dovrebbe querare il DB (ho studiato i passaggi dall'ottimo tutorial di Qlimax)

listagps.java

Codice (Java): [Seleziona]
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listagps);
       
        TextView nomelista=(TextView)findViewById(R.id.nomelista);
        TextView latitudinelista=(TextView)findViewById(R.id.latitudinelista);
        TextView longitudinelista=(TextView)findViewById(R.id.longitudinelista);
       
       
        // CREAZIONE LISTA PUNTI GPS SU LAYOUT LISTAGPS
       
        ListView posizionigps=(ListView)findViewById(R.id.listgps);

        final listagpsdb db = new listagpsdb(getApplicationContext());
       
        db.open();
       
        Cursor c=listagpsdb.fetchProducts();
        startManagingCursor(c);
       
        @SuppressWarnings("deprecation")
                SimpleCursorAdapter adapter=new SimpleCursorAdapter (
                        this,
                        R.layout.listagps_item,
                        c,
                        new String[]{listagpsdb.PositionsMetaData.POSITIONS_NAME_KEY,listagpsdb.PositionsMetaData.POSITIONS_LONGITUDE_KEY,listagpsdb.PositionsMetaData.POSITIONS_LATITUDE_KEY},
                        new int []{R.id.nomelista,R.id.longitudinelista,R.id.latitudinelista});
                       
        posizionigps.setAdapter(adapter);
       
        int nomecol=c.getColumnIndex(listagpsdb.PositionsMetaData.POSITIONS_NAME_KEY);
        int loncol=c.getColumnIndex(listagpsdb.PositionsMetaData.POSITIONS_LONGITUDE_KEY);
        int lancol=c.getColumnIndex(listagpsdb.PositionsMetaData.POSITIONS_LATITUDE_KEY);
       
        if(c.moveToFirst()){
                do {
                         nomelista.append(c.getString(nomecol));
                         latitudinelista.append(c.getString(lancol));
                         longitudinelista.append(c.getString(loncol));
                         } while (c.moveToNext());
               
                }
       
        db.close();    
       
    }
   
             
    }

Questa la class di crezione database e estrazione dati:

Codice (Java): [Seleziona]
   public static Cursor fetchProducts(){ //attenzione cambioato,messo static
        return mDb.query(PositionsMetaData.POSITIONS_TABLE, null,null,null,null,null,null);              
}

static class PositionsMetaData {  
        static final String POSITIONS_TABLE = "position";
        static final String ID = "_id";
        static final String POSITIONS_NAME_KEY = "name";
        static final String POSITIONS_LATITUDE_KEY = "lat";
        static final String POSITIONS_LONGITUDE_KEY = "lon";
}

private static final String POSITIONS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  
                + PositionsMetaData.POSITIONS_TABLE + " ("
                + PositionsMetaData.ID + " integer primary key autoincrement, "
                + PositionsMetaData.POSITIONS_NAME_KEY + " text, "
                + PositionsMetaData.POSITIONS_LATITUDE_KEY + " double not null, "
                + PositionsMetaData.POSITIONS_LONGITUDE_KEY + " double not null); ";

Questo l'errore che mi viene dato dal logcat:

Codice (Java): [Seleziona]
05-02 17:02:02.705: E/AndroidRuntime(964): Caused by: java.lang.NullPointerException
05-02 17:02:02.705: E/AndroidRuntime(964):      at com.drive.info.listagps.onCreate(listagps.java:49)
05-02 17:02:02.705: E/AndroidRuntime(964):      at android.app.Activity.performCreate(Activity.java:5008)

Da questo capisco che la riga nomelista.append(c.getString(nomecol)); e nel caso la commenti,le altre a seguire,risulta essere nulla. Il database ho verificato che viene correttamente popolato,tuttavia a quanto pare il problema è che non riesco a far leggere i dati.

Come si vede ci sono tre colonne (più la ID che non viene presa in considerazione): nomecol,loncol e lancol che sono rispettivamente una stringa e due double quindi qua i quesiti:

sbaglio a chiamarli come INT quando vado a prendere il columnindex con il cursor,ossia la discrepanza mi dà problemi? perhè ho provato a prelevare i dati come string e come double,mettendo in seguito,nella ciclata del cursor: getdouble e getstring,ma eclipse mi dà errore e non mi procede con la compilazione.

Il metodo fetchProducts se ho ben compreso è colui che mi determina al query SELECT dal database (alla fine la query è una semplice SELECT * FROM position) ed è seguiti da vari null che sono gl'altri possibili parametri da dare alla query.

In cosa secondo voi sbaglio? Avete indizi utili da darmi così da mettermi sulla buona strada su ciò che devo osservare con più attenzione?

Una cosa che non mi convince è quel STATIC che mi ha richiesto eclipse davanti al fetchproducts,così non dovrebbe renderlo "fermo"? (sinceramente ancora non ho compreso bene l'uso dello static anche se sembra simile al final se non che si applica a più frangenti)

Vi ringrazio sin da ora! :)

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:Query su DB per dati in listview,aiutatemi a capire
« Risposta #1 il: 02 Maggio 2013, 22:05:18 CEST »
0
Codice (Java): [Seleziona]
05-02 17:02:02.705: E/AndroidRuntime(964): Caused by: java.lang.NullPointerException
05-02 17:02:02.705: E/AndroidRuntime(964):      at com.drive.info.listagps.onCreate(listagps.java:49)
05-02 17:02:02.705: E/AndroidRuntime(964):      at android.app.Activity.performCreate(Activity.java:5008)

Da questo capisco che la riga nomelista.append(c.getString(nomecol)); e nel caso la commenti,le altre a seguire,risulta essere nulla.

Non è la riga ad essere nulla, ma uno degli oggetti a cui fai riferimento. Per esempio potrebbe essere nullo nomelista.

Procedi di debug "vecchio stile", cioè fai precedere quella riga da codice tipo questo (scrivo per rendere l'idea) e vedi cosa esce nel LogCat:
Codice (Java): [Seleziona]
Log.d("MIOTAG","nomelista = "+nomelista);
Log.d("MIOTAG","nomecol = "+nomecol);
Log.d("MIOTAG","c.getString(nomecol) = "+c.getString(nomecol));
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline TheWhiteWolf

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung SGS3
  • Sistema operativo:
    Ubuntu 12.04 / Win 7
Re:Query su DB per dati in listview,aiutatemi a capire
« Risposta #2 il: 04 Maggio 2013, 13:51:23 CEST »
0
Scusa il ritardo in risposta ma ieri tornado e stamane terremoto,mi hanno dato da fare e non poso tra danni a casa e altro,ma veniamo a noi ora che ho un'attimo di tempo.

Non ho mai usato la possibilità di lettura dei risultati con il LOG direttamente nel logcat.

Quindi scrivendo simile allo snippet che mi hai postato tu,vado a chiedere che i risultati di ciò che stà tra le parentesi venga mostrato nel logcat,in modo che io possa controllare se il campo è stato riempito,giusto?

Andando dentro all'applicazione nel telefono e facendo una query select con un'app di gestione del database,direttamente al database dell'app che ho creato,vedo che tutti i campi risultano compilati,nessuno di essi è nullo (quindi vuoto) ma al massimo ci trovi il numero 0 (a meno che non sia quello a dare fastidio),il campo nomelista di per se viene riempito con la stessa lettera sempre (usato ora proprio per provare che il DB venisse popolato).

Una cosa non ho capito,ossia la sintesi dello snippet.

Log.d è la richiesta del dove leggere l'uscita

Ma gl'altri cosa dovrebbero rappresentare? nomelista è la mia TextView,nomecol è la variabile che viene riempita con il risultato del'estrazione da parte del cursore del valore di quella riga in data colonna e in seguito il +nomelista immagino sia la ricomposizione della riga da leggere. Ma il "MIOTAG" cosa dovrebbe essere? E' che così se dovessi riutilizzare questo log "vecchio stile come dici tu",per controllare o effettuare controlli,posso adattare lo snippet a molteplici esigenze.

Avresti la pazienza di spiegarmi in breve o comunque di darmi qualche dritta a riguardo? Così posso poi ripetere l'operazione per i vari campi (anche se da come ti dicevo,mi risultano tutti pieni a meno che uno 0 non dia fastidio in lettura essendo che io dichiaro un double)

Post unito: 04 Maggio 2013, 16:08:10 CEST
Ok,come non detto,sono riuscito a capire cosa e come è composta la stringa del log.d e a metterla in atto e devo darti ragione,il campo è null ma l'ultima delle tre stringhe che mi hai scritto non viene visualizzata nel logcat,nomelista è normale che sia null finchè non viene popolato con l'append dopo l'estrazione del dato,ma il dato di per se pare che non venga estratto,quindi non mi appare nulla,e comunque la stringa non mi appare.Quale potrebbe essere il motivo?


Non riesco a  capire dove stò sbagliando,nel DB và tutto bene,quindi il problema è sicuramente nella lettura/estrazione dei dati,o nell'inserimento nel suo layout (ormai le penso tutte). Avete qualche strada o modo da suggerirmi per eventuali verifiche?
« Ultima modifica: 04 Maggio 2013, 16:24:53 CEST da TheWhiteWolf »

Offline TheWhiteWolf

  • Nuovo arrivato
  • *
  • Post: 4
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung SGS3
  • Sistema operativo:
    Ubuntu 12.04 / Win 7
Re:Query su DB per dati in listview,aiutatemi a capire
« Risposta #3 il: 07 Maggio 2013, 19:31:53 CEST »
0
RISOLTO

Banale errore mio,non avevo fatto l'inflater dell'xml che conteneva i box che mi interessavano. Se può essere d'aiuto,nell' OnCreate ho aggiunto questo

Codice (Java): [Seleziona]
LayoutInflater li = getLayoutInflater();
        View vListItems = li.inflate(R.layout.listagps_item, null);