Autore Topic: CursorIndexOutOfBoundsException: Index 2 requested, with a size 2  (Letto 1349 volte)

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
0
Ragazzi ho un problema con il cursore, capisco che questo errore è legato ad un problema di lettura del cursore sul db e l'ho anche individuato solo che non riesco a risolverlo. Vi posto il codice e vi spiego l'errore magari qualcuno di voi mi riesce ad aiutare :
Codice (Java): [Seleziona]
               private Cursor cursore;
               private List<Address> address;
               private GestioneDB db;
 
        @Override
        public void onCreate() {
                super.onCreate();
                context = this;
                db = new GestioneDB(this);
                db.OpenDB();
                        //Seleziona tutti i record della tabella
                cursore = db.select_record(0);
                LeggiSegnalazioni thread_leggi = new LeggiSegnalazioni(handler);
                thread_leggi.start();
               
        }

               Handler handler = new Handler{
                              @Override
                              public void handleMessage(Message msg) {
                                    int result = msg.getData().getInt("result");
                                   //#### DATI LOCALI
                                           String idp = cursore.getString(cursore.getColumnIndex(Meta_Tab.ID));
                                    if(result==1){
                                       //Cancella
                                          db.delete(idp);
                                    }else{
                                         db.update(idp);
                                    }
                              }        
             };

                   //##### THREAD #######
                   public class LeggiSegnalazioni extends Thread{
                private Geocoder geocoder;
                private Handler h;
               
                public LeggiSegnalazioni (Handler handler){
                        h = handler;
                }
                @Override
                public void run() {
                        geocoder = new Geocoder(context,Locale.ITALY);
                        if(cursore.getCount()!=0){
                           while(cursore.moveToNext()){
                                    latitudine = Double.parseDouble(cursore.getString(cursore.getColumnIndex(Meta_Tab.LATITUDINE)));
                                   longitudine = Double.parseDouble(cursore.getString(cursore.getColumnIndex(Meta_Tab.LONGITUDINE)));

                             try {
                                //Prelevo indirizzo
                                list = geocoder.getFromLocation(latitudine,longitudine,1);
                                //Geocoder ha rilevato il dato e passa all'handler 1 per recuperare l'id del record
                                invio_handler(1);
                             } catch (IOException e) {
                                //Geocoder non ha rilevato i dati e passa all'handler 2 per aggiornare il record                                                invio_handler(2);
                                e.printStackTrace();
                            }
                         }
                        }
              }
                      private void invio_handler(int result) {
                        Message msg = h.obtainMessage();
                        Bundle bundle = new Bundle();
                        bundle.putInt("result", result);
                        msg.setData(bundle);
                        h.sendMessage(msg);
                      }
           } //Fine Thread

Supponiamo ora che ci siano 2 record nel database, al primo record va tutto bene, al secondo anche, ma poi (almeno per quello che ho capito) fa un 3° giro nel thread però la condizione while(cursore.moveToNext()) è false quindi ritorna (non sò perchè) nell'handler con result settato a 1 e cerca di leggere String idp = cursore.getString(cursore.getColumnIndex(Meta_Tab.ID)); che però in questo caso lo fa andare in eccezzione....

Scusate vorrie aggiungere, non sò se può essere d'aiuto, che questo errore si verifica sulla 2.3.3 mentre sulla 2.2 no.

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:CursorIndexOutOfBoundsException: Index 2 requested, with a size 2
« Risposta #1 il: 28 Luglio 2011, 10:29:43 CEST »
0
Da una primissima impressione mi sembra sia impostato male il multithreading. Per essere breve: tu fai accesso concorrente (dall'handler messaggi e dal thread separato) ad una stessa risorsa (il cursore): mentre il messaggio è in viaggio, tu modifichi il cursore dal thread.

Prova questa cosa: esegui tutte le operazioni sul cursore nel Thread, e nel messaggio spedisci direttamente idp, così nell'handler non dovrai più toccare il cursore.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:CursorIndexOutOfBoundsException: Index 2 requested, with a size 2
« Risposta #2 il: 28 Luglio 2011, 11:00:08 CEST »
0
Ok provo subito! speriamo bene :)

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:CursorIndexOutOfBoundsException: Index 2 requested, with a size 2
« Risposta #3 il: 28 Luglio 2011, 19:28:53 CEST »
0
Si bradipao, avevi ragione era proprio quello!!! praticamente ho fatto come hai detto ho messo nel thread tutte le operazioni compiute con il cursore in modo da non farlo andare in giro tra i vari thread.....anche se non mi sembra una cosa giusta perchè secondo me nel thread dovrebbero esserci solo le operazioni che bloccano la UI...comunque non si poteva fare altrimenti.

Dato che ci troviamo, le variabili che io dichiaro qui dopo la dichiarazione della classe (Paperino e Pippo nell'esempio) restano in memoria ?
Codice (Java): [Seleziona]
       private Cursor paperino;
       public int pippo;
 
        @Override
        public void onCreate() {
                super.onCreate();

Lo chiedo perchè queste variabili, quando chiudo l'applicazione con il tasto back, me le trovo già valorizzate con l'ultimo valore quando riapro l'applicazione.....è normale ?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:CursorIndexOutOfBoundsException: Index 2 requested, with a size 2
« Risposta #4 il: 28 Luglio 2011, 21:03:31 CEST »
0

Dato che ci troviamo, le variabili che io dichiaro qui dopo la dichiarazione della classe (Paperino e Pippo nell'esempio) restano in memoria ?
Codice (Java): [Seleziona]
       private Cursor paperino;
       public int pippo;
 
        @Override
        public void onCreate() {
                super.onCreate();

Lo chiedo perchè queste variabili, quando chiudo l'applicazione con il tasto back, me le trovo già valorizzate con l'ultimo valore quando riapro l'applicazione.....è normale ?

Se l'activity non viene distrutta non è normale che te le trovi già valorizzate.

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:CursorIndexOutOfBoundsException: Index 2 requested, with a size 2
« Risposta #5 il: 28 Luglio 2011, 22:21:46 CEST »
0
E allora come è possibile che se la conserva ?? è una variabile che ho dichiarao solo in quell'activity, non uso variabili globali....non sarà forse perchè quell'activity è un service ? però anche se killo il service se riavvio il programma è sempre la stessa storia...

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:CursorIndexOutOfBoundsException: Index 2 requested, with a size 2
« Risposta #6 il: 29 Luglio 2011, 12:28:54 CEST »
0
E allora come è possibile che se la conserva ?? è una variabile che ho dichiarao solo in quell'activity, non uso variabili globali....non sarà forse perchè quell'activity è un service ? però anche se killo il service se riavvio il programma è sempre la stessa storia...

C'è una qualche condizione che non hai scritto in quel piccolo esempio di codice ;)