Autore Topic: Problema Cursor  (Letto 1207 volte)

Offline Bimbonanni

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Google+
    • bimbonanni
    • MatteoHammer
    • Mostra profilo
    • Organici Musicali
  • Dispositivo Android:
    HTC One X & Samsung Galaxy Nexus
  • Sistema operativo:
    Linux Mint 14
Problema Cursor
« il: 01 Marzo 2013, 13:26:18 CET »
0
Salve a tutti.

Ho un problema incomprensibile col cursore a seguito di una Select su un DB.

Il codice è il seguente:
Codice (Java): [Seleziona]
public class Add extends Activity {
       
        private DbHelper helper;
        private SQLiteDatabase db;
       
        private String[] categorie;
        private int i;
        private Cursor c = null;
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                helper = new DbHelper(this);
                setContentView(R.layout.activity_add);
                               
                Log.i("PassRem->Add", "Rendo SCRIVIBILE");     
                db = helper.getWritableDatabase();
               
                Button annulla = (Button) findViewById(R.id.annulla);
                Button reset = (Button) findViewById(R.id.resetta);
                Button add = (Button) findViewById(R.id.aggiungiPassword);
               
                Log.i("PassRem->Add", "Bottoni Creati");       
               
                //Query: SELECT nome FROM categoria
                db = helper.getReadableDatabase();
                String[] columns = {"nome"};
                // Faccio la Query
                c = db.query("categoria", columns, null, null, null, null, null);
               
                // Setto le variabili del caso
                int max = c.getCount();
                categorie = new String[max];
               
                Log.i("PassRem->Add->Cursore", "Numero righe: "+c.getCount());
                Log.i("PassRem->Add->Cursore", "Numero colonne: "+c.getColumnCount());
                Log.i("PassRem->Add->Cursore", "Nome colonna: "+c.getColumnName(0));
                       
                //Log.i("PassRem->Add", "Sto per entrare nel FOR - || "+c.getString(0));       
       
                for (i=0; i<max; i++) {
                        Log.i("PassRem->Add", "Nel FOR - Dato categorie["+i+"]: "+categorie[i]);
                        categorie[i] = c.getString(0);
                        Log.i("Nel for", "Dato: "+categorie[i]);
                }

                Log.i("PassRem->Add", "Preso da DB");
E il LogCat è questo:
Codice: [Seleziona]
03-01 13:18:18.173: I/PassRem->Add(31976): Rendo SCRIVIBILE
03-01 13:18:18.204: I/PassRem->Add(31976): Bottoni Creati
03-01 13:18:18.204: I/PassRem->Add->Cursore(31976): Numero righe: 3
03-01 13:18:18.204: I/PassRem->Add->Cursore(31976): Numero colonne: 1
03-01 13:18:18.204: I/PassRem->Add->Cursore(31976): Nome colonna: nome
03-01 13:18:18.204: I/PassRem->Add(31976): Nel FOR - Dato categorie[0]: null
03-01 13:18:18.243: E/AndroidRuntime(31976): FATAL EXCEPTION: main
03-01 13:18:18.243: E/AndroidRuntime(31976): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.main.passrem/com.main.passrem.Add}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 3
03-01 13:18:18.243: E/AndroidRuntime(31976):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at android.app.ActivityThread.access$600(ActivityThread.java:141)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at android.os.Handler.dispatchMessage(Handler.java:99)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at android.os.Looper.loop(Looper.java:137)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at android.app.ActivityThread.main(ActivityThread.java:5041)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at java.lang.reflect.Method.invokeNative(Native Method)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at java.lang.reflect.Method.invoke(Method.java:511)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at dalvik.system.NativeStart.main(Native Method)
03-01 13:18:18.243: E/AndroidRuntime(31976): Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 3
03-01 13:18:18.243: E/AndroidRuntime(31976):         at android.database.AbstractCursor.checkPosition(AbstractCursor.java:424)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at com.main.passrem.Add.onCreate(Add.java:66)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at android.app.Activity.performCreate(Activity.java:5104)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
03-01 13:18:18.243: E/AndroidRuntime(31976):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
03-01 13:18:18.243: E/AndroidRuntime(31976):         ... 11 more

Cioè come caspita si spiega che le stampe dei vari metodi del cursore (c.getCount(), c.getColumnName() ecc) funzionino e poi quando entro nel for si pianta?
Tra l'altro se stampo c.getString(0) fuori dal for funziona e mi stampa la prima riga della tabella!!!
Avevo anche provato a mettere c.moveToFirst(); prima del for ma non cambia niente...
Non ci arrivo! Dove sta il problema?
Strumenti per lo sviluppo di Android:
- Eclipse con ADT ed SDK Versione 8
- Versione API: variabile...
- Come emulatori utilizzo direttamente i miei dispositivi Android

Offline Angelus84

  • Utente junior
  • **
  • Post: 59
  • Respect: +1
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Next
  • Play Store ID:
    Angelus
  • Sistema operativo:
    Windows 7
Re:Problema Cursor
« Risposta #1 il: 01 Marzo 2013, 13:58:34 CET »
0
 
Codice (Java): [Seleziona]
 db = helper.getReadableDatabase(); lo puoi anche omettere dal momento che hai già inserito   
Codice (Java): [Seleziona]
  db = helper.getWritableDatabase();.

Poi per l'errore, secondo me, dovresti inserire come indice 1 nel 
Codice (Java): [Seleziona]
c.getString(1) questo perchè l'indice 0 prende l' id della tabella.

Offline Bimbonanni

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Google+
    • bimbonanni
    • MatteoHammer
    • Mostra profilo
    • Organici Musicali
  • Dispositivo Android:
    HTC One X & Samsung Galaxy Nexus
  • Sistema operativo:
    Linux Mint 14
Re:Problema Cursor
« Risposta #2 il: 01 Marzo 2013, 14:03:03 CET »
0
Eh no perché io tiro fuori solo una colonna.
Le colonne sono due: _id e nome e io estraggo solo nome.

E se metto c.getString(0) fuori dal for funziona, è questa la fregatura  :D
Strumenti per lo sviluppo di Android:
- Eclipse con ADT ed SDK Versione 8
- Versione API: variabile...
- Come emulatori utilizzo direttamente i miei dispositivi Android

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:Problema Cursor
« Risposta #3 il: 01 Marzo 2013, 14:17:23 CET »
0
Provato invece a leggere il cursore così?

Codice (Java): [Seleziona]
c = db.query("categoria", columns, null, null, null, null, null);

List<String> catList = new List<String>();

c.moveToFirst();
do {
  catList.add(c.getString(0));
}  while (c.moveToNext());
c.close();

String[] categorie = catList.toArray(new String[0]);

A me onestamente il problema sembra proprio che non posizioni il cursore all'inizio del ciclo e non lo fai avanzare durante la lettura...

Offline Bimbonanni

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Google+
    • bimbonanni
    • MatteoHammer
    • Mostra profilo
    • Organici Musicali
  • Dispositivo Android:
    HTC One X & Samsung Galaxy Nexus
  • Sistema operativo:
    Linux Mint 14
Re:Problema Cursor
« Risposta #4 il: 01 Marzo 2013, 14:32:09 CET »
0
Sulla riga
Codice (Java): [Seleziona]
List<String> catList = new List<String>();Mi dice "cannot instantiate" the type List<String>  o_O
Strumenti per lo sviluppo di Android:
- Eclipse con ADT ed SDK Versione 8
- Versione API: variabile...
- Come emulatori utilizzo direttamente i miei dispositivi Android

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:Problema Cursor
« Risposta #5 il: 01 Marzo 2013, 14:38:11 CET »
+1
Sulla riga
Codice (Java): [Seleziona]
List<String> catList = new List<String>();Mi dice "cannot instantiate" the type List<String>  o_O

Perché sono un cretino e ho scritto di getto :-P
Codice (Java): [Seleziona]
List<String> catList = new ArrayList<String>();

Offline Bimbonanni

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Google+
    • bimbonanni
    • MatteoHammer
    • Mostra profilo
    • Organici Musicali
  • Dispositivo Android:
    HTC One X & Samsung Galaxy Nexus
  • Sistema operativo:
    Linux Mint 14
Re:Problema Cursor
« Risposta #6 il: 01 Marzo 2013, 14:40:39 CET »
0
Aah ok xD
Allora provo subito :p

Post unito: 01 Marzo 2013, 14:44:17 CET
Ora funziona...
Mi hai risparmiato un'ulcera al fegato ahah

Eppure avevo tentato tutti i modi di far avanzare quel maledetto cursore ma forse era sbagliato il tipo di dato in cui tentavo di mettere la stringa :)

Grazie!
« Ultima modifica: 01 Marzo 2013, 14:44:17 CET da Bimbonanni, Reason: Merged DoublePost »
Strumenti per lo sviluppo di Android:
- Eclipse con ADT ed SDK Versione 8
- Versione API: variabile...
- Come emulatori utilizzo direttamente i miei dispositivi Android

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema Cursor
« Risposta #7 il: 01 Marzo 2013, 15:06:47 CET »
0
Aah ok xD
Allora provo subito :p

Post unito: 01 Marzo 2013, 14:44:17 CET
Ora funziona...
Mi hai risparmiato un'ulcera al fegato ahah

Eppure avevo tentato tutti i modi di far avanzare quel maledetto cursore ma forse era sbagliato il tipo di dato in cui tentavo di mettere la stringa :)

Grazie!

semplicemente nel tuo codice non sistemavi mai la posizione del cursore, non facevi moveToFirst e quindi l'indice era -1 per forza
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Bimbonanni

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Google+
    • bimbonanni
    • MatteoHammer
    • Mostra profilo
    • Organici Musicali
  • Dispositivo Android:
    HTC One X & Samsung Galaxy Nexus
  • Sistema operativo:
    Linux Mint 14
Re:Problema Cursor
« Risposta #8 il: 01 Marzo 2013, 15:08:24 CET »
0
Capito :)

Grazie del chiarimento  ;-)
Strumenti per lo sviluppo di Android:
- Eclipse con ADT ed SDK Versione 8
- Versione API: variabile...
- Come emulatori utilizzo direttamente i miei dispositivi Android