Autore Topic: Problemi con le query  (Letto 797 volte)

Offline tascabile

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Problemi con le query
« il: 19 Ottobre 2012, 18:10:08 CEST »
0
ragazzi sono ancora io alle prese con il mio database...non riesco ad eseguire la mia cara query, premetto che il database è popolato da 3 righe

Codice (Java): [Seleziona]
public class pagina_birra extends Activity {

       
        private TextView leggi;
        String lettura;
        public void onCreate(Bundle saveIstanceState) {
                super.onCreate(saveIstanceState);
                setContentView(R.layout.pagina_birra);
               
                Intent intent = getIntent();
            String pkg = getPackageName();
            String lettura = intent.getStringExtra(pkg+".pass_stringa");
            leggi = (TextView) findViewById(R.id.textView1);   
                leggi.setText(lettura);
               
                DB_method database = new DB_method(getApplicationContext());                                                                            //creo l'helper per aprire il DB
        SQLiteDatabase database2 = database.getWritableDatabase();
       
       Cursor risultato_query = database2.rawQuery("SELECT NOME FROM LISTA_BIRRE WHERE NAZIONE = '"+ lettura +"' ",null);
       
       
       
        int index= risultato_query.getColumnIndex(lettura);
        lettura=risultato_query.getString(index);
        leggi.setText(index);
               
        }
}


ecco il logcat

Codice: [Seleziona]
10-19 16:07:30.005: D/AndroidRuntime(1000): Shutting down VM
10-19 16:07:30.005: W/dalvikvm(1000): threadid=1: thread exiting with uncaught exception (group=0x40015560)
10-19 16:07:30.015: E/AndroidRuntime(1000): FATAL EXCEPTION: main
10-19 16:07:30.015: E/AndroidRuntime(1000): java.lang.RuntimeException: Unable to start activity ComponentInfo{tascabile.applicazione.birra/tascabile.applicazione.birra.pagina_birra}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 3
10-19 16:07:30.015: E/AndroidRuntime(1000):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at android.app.ActivityThread.access$1500(ActivityThread.java:117)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at android.os.Handler.dispatchMessage(Handler.java:99)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at android.os.Looper.loop(Looper.java:123)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at android.app.ActivityThread.main(ActivityThread.java:3683)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at java.lang.reflect.Method.invokeNative(Native Method)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at java.lang.reflect.Method.invoke(Method.java:507)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at dalvik.system.NativeStart.main(Native Method)
10-19 16:07:30.015: E/AndroidRuntime(1000): Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 3
10-19 16:07:30.015: E/AndroidRuntime(1000):         at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at tascabile.applicazione.birra.pagina_birra.onCreate(pagina_birra.java:33)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-19 16:07:30.015: E/AndroidRuntime(1000):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
10-19 16:07:30.015: E/AndroidRuntime(1000):         ... 11 more
10-19 16:07:31.735: I/Process(1000): Sending signal. PID: 1000 SIG: 9
10-19 16:07:34.180: W/KeyCharacterMap(1011): No keyboard for id 0
10-19 16:07:34.180: W/KeyCharacterMap(1011): Using default keymap: /system/usr/keychars/qwerty.kcm.bin


Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
R: Problemi con le query
« Risposta #1 il: 19 Ottobre 2012, 18:30:03 CEST »
0
getColumnIndex(lettura);

Non credo sia esattamente quello che volevi fare.

Forse intendevi getColumnIndex("NOME") ;

Inviato dal mio XT910 con Tapatalk 2
« Ultima modifica: 19 Ottobre 2012, 20:43:11 CEST da Sakazaki »

Offline tascabile

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Problemi con le query
« Risposta #2 il: 20 Ottobre 2012, 00:47:29 CEST »
0
Giustissima osservazione, e sbagliavo pienamente, ma ora l'errore è mutato, posto il logcat

Codice: [Seleziona]
10-19 22:39:11.650: W/System.err(595): sto caricando un record
10-19 22:39:11.650: W/System.err(595): sto caricando un record
10-19 22:39:11.660: W/System.err(595): sto caricando un record
10-19 22:39:17.429: W/ResourceType(595): No package identifier when getting value for resource number 0x00000000
10-19 22:39:17.429: D/AndroidRuntime(595): Shutting down VM
10-19 22:39:17.429: W/dalvikvm(595): threadid=1: thread exiting with uncaught exception (group=0x40015560)
10-19 22:39:17.459: E/AndroidRuntime(595): FATAL EXCEPTION: main
10-19 22:39:17.459: E/AndroidRuntime(595): java.lang.RuntimeException: Unable to start activity ComponentInfo{tascabile.applicazione.birra/tascabile.applicazione.birra.pagina_birra}: android.content.res.Resources$NotFoundException: String resource ID #0x0
10-19 22:39:17.459: E/AndroidRuntime(595):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
10-19 22:39:17.459: E/AndroidRuntime(595):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
10-19 22:39:17.459: E/AndroidRuntime(595):         at android.app.ActivityThread.access$1500(ActivityThread.java:117)
10-19 22:39:17.459: E/AndroidRuntime(595):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
10-19 22:39:17.459: E/AndroidRuntime(595):         at android.os.Handler.dispatchMessage(Handler.java:99)
10-19 22:39:17.459: E/AndroidRuntime(595):         at android.os.Looper.loop(Looper.java:123)
10-19 22:39:17.459: E/AndroidRuntime(595):         at android.app.ActivityThread.main(ActivityThread.java:3683)
10-19 22:39:17.459: E/AndroidRuntime(595):         at java.lang.reflect.Method.invokeNative(Native Method)
10-19 22:39:17.459: E/AndroidRuntime(595):         at java.lang.reflect.Method.invoke(Method.java:507)
10-19 22:39:17.459: E/AndroidRuntime(595):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-19 22:39:17.459: E/AndroidRuntime(595):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-19 22:39:17.459: E/AndroidRuntime(595):         at dalvik.system.NativeStart.main(Native Method)
10-19 22:39:17.459: E/AndroidRuntime(595): Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0
10-19 22:39:17.459: E/AndroidRuntime(595):         at android.content.res.Resources.getText(Resources.java:201)
10-19 22:39:17.459: E/AndroidRuntime(595):         at android.widget.TextView.setText(TextView.java:2857)
10-19 22:39:17.459: E/AndroidRuntime(595):         at tascabile.applicazione.birra.pagina_birra.onCreate(pagina_birra.java:34)
10-19 22:39:17.459: E/AndroidRuntime(595):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-19 22:39:17.459: E/AndroidRuntime(595):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
10-19 22:39:17.459: E/AndroidRuntime(595):         ... 11 more

Ho notato svolgendo alcune prove, che se elimino le istruzioni getColumnIndex("NOME") e getString(index) tutto fila liscio, ma se appunto svolgo un'operazione sul risultato della query  becco l'errore. Presuppongo che ci sia qualcosa che non va o nel risultato della query o non so che pensare se volete vi posto anche i dati del database se vi servono.

ringrazio ancora tutti per il cortese aiuto

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Problemi con le query
« Risposta #3 il: 20 Ottobre 2012, 08:41:40 CEST »
0
Mea culpa, da tapatalk non avevo letto bene tutto il codice e mi era sfuggito che c'era un'altra imprecisione.
Questo nuovo problema è dovuto a questa riga:

Codice (Java): [Seleziona]
leggi.setText(index);
va cambiata con
Codice (Java): [Seleziona]
leggi.setText(lettura);

In TextView esiste sia un setText che accetta una stringa che un setText che accetta un intero, quest'ultima variante per permettere di impostare stringhe codificate nelle resource.
Tu chiaramente vuoi usare la prima per impostare la stringa che leggi da database, ma per una svista stai usando la seconda; essendo lecito passargli un intero il compilatore non te lo segnala come errore, ma a runtime lancia l'eccezione perché giustamente non esiste nessuna risorsa con id pari a 0 (il valore di index).

Offline JNS on the Net

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus S, HTC One, Nexus 7 2013
  • Sistema operativo:
    Windows 8
Re:Problemi con le query
« Risposta #4 il: 20 Ottobre 2012, 09:20:58 CEST »
0
Ciao,
   se posso un paio di suggerimenti:
1) Prova a inserire tutti i metodi di apertura del DB nella classe DB_method ad esempio con una private class al suo interno che richiami poi dal costruttore

Codice: [Seleziona]
public DB_method(Context ctx, String dbName){
            mContext=ctx;
            mDbHelper=new DbHelper(ctx, dbName, null, DB_VERSION);
    }
   
  //Database Creation Helper
    private class DbHelper extends SQLiteOpenHelper {

        public DbHelper(Context context, String name, CursorFactory factory,int version) {
                super(context, name, factory, version);
        }

            //tables creation, only after database creation
        @Override
        public void onCreate(SQLiteDatabase mydb) {
                mydb.execSQL(BIRRE_TABLE_CREATE);
                        }

        @Override
        public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                //database upgrades
        }
    }
   
         //creates/opens the database if already exists
    public void openDB(){
            mDb=mDbHelper.getWritableDatabase();
    }
   
        //closes the database
    public void closeDB(){
            mDb.close();
    }
   
    public void deleteDB(Context ctx, String dbName){
            ctx.deleteDatabase(dbName);
    }

2) Sempre nella DB_Method potresti poi creare dei metodi di estrazione che richiami dall'esterno
3) Prova a usare il metodo SQLiteDatabase.query per le estrazioni
4) Nome della classe pagina_birra con iniziale maiuscola (per convezione)

(un grazie a Qlimax per il suo tutorial a cui ho fatto riferimento) ;-)

J.

Offline tascabile

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Problemi con le query
« Risposta #5 il: 20 Ottobre 2012, 11:55:50 CEST »
0
@Sakazaki: quello era solo un controllo che facevo er vedere se almeno da quell'istruzione mi forniva qualcosa in output, infatti poi mettevo a commento il resto e poi ho lasciato così quando ho postato, inutile dire che i risultati sono stati sempre nulli;

@jns_on_the_net: so che per comodità e forse anche per migliorare il codice è utile creare un metodo per la query, però voglio prima provare a farla funzionare così mettendo le cose una dietro l'altra, quando vedrò che mi funzionerà la sposterò nella classe DB_method.

comunque ancora nessun risultato anche usando il metodo query() (che a mio parere trovo più complesso da gestire con rawquery() usando il linguaggio Sql si ha più libertà).
Avete altre idee?? provo a postare il mio progetto come allegato??

Offline JNS on the Net

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Nexus S, HTC One, Nexus 7 2013
  • Sistema operativo:
    Windows 8
R: Problemi con le query
« Risposta #6 il: 20 Ottobre 2012, 14:59:00 CEST »
0
Ora che guardo non ti sei posizionato sul primo elemento del cursore.
Prova
   risultato_ query.moveToFirst()
E poi nel caso ci la sul cursore x gli altri dati

J. on the Nexus


Offline tascabile

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
Re:Problemi con le query
« Risposta #7 il: 20 Ottobre 2012, 15:45:19 CEST »
0
Allora errore trovato, mi sono riletto mille volte la documentazione e sono arrivato a capo del problema. In poche parole quando chiamavo il getstring() io al suo interno passavo il NOME della colonna, invece ho notato che richiede attraverso un intero il NUMERO della colonna che desidero selezionare, dunque essendo la mia query un'istruzione che mi restituisce una sola colonna in output, è bastato passare come parametro 0 per farmi andare tutto liscio.
Il moveToFirst() inizialmente non l'avevo chiamato, in quanto pensavo che funzionasse un po come un vettore, invece mi sono ricreduto.
Ringrazio tutti voi per il grande aiuto che mi avete dato, spero un giorno (anche se lontano data la mia "asineria") di ricambiare il favore.
Buon week-end :)