Autore Topic: Db e cancellazione row  (Letto 1232 volte)

Offline sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Db e cancellazione row
« il: 09 Agosto 2011, 13:22:48 CEST »
0
Ciao a tutti.. spero di essere chiaro nella spiegazione del mio problema..
sto ultimando un activity in cui vengono salvati e gestiti dei preferiti(dei links, quindi delle stringhe) e per fare questo mi sono affidato ad un DB.
l'inserimento nn mi ha dato problemi, vengono inseriti tutti in maniera sequenziale.
tutta via ho trovato qualche difficoltà nella cancellazione della row, che avviene col semplicissimo metodo:

Codice (Java): [Seleziona]
 public boolean deleteTitle(long rowId)
    {
        return db.delete(DATABASE_TABLE, KEY_ROWID +
                        "=" + rowId, null) > 0;
                       
    }

quando l'activity parte, tramite AsyncTask, fa una "lettura" del database, e non c'è nessun tipo di problema.

Ma non appena cancello una row, allora il cursore(ripartendo da 1)  non riesce a "saltare" la row cancellata"

esempio: [1] ---> [2] ---> [3] ---> [4]  .... tutto ok!

se elimino la [3], il salto dal  [2] --> [4] fa crashare l'applicazione.

il logcat mi dice chiaramente che è un problema di "cursor index" in quanto essendo la [3] eliminata, il valore è nullo.
è un pò come se venisse cancellato il valore, ma la row restasse li... vuota, e pronta a far crashare l'app.

Codice (Java): [Seleziona]
08-09 13:08:43.973: ERROR/AndroidRuntime(9074): FATAL EXCEPTION: AsyncTask #1
08-09 13:08:43.973: ERROR/AndroidRuntime(9074): java.lang.RuntimeException: An error occured while executing doInBackground()
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at java.lang.Thread.run(Thread.java:1102)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at com.android.software.wallpaperfull.Favourite$InitTask.doInBackground(Favourite.java:618)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at com.android.software.wallpaperfull.Favourite$InitTask.doInBackground(Favourite.java:1)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

io non ho mai gestito un DB, quindi mi chiedevo se sia un problema risolvibile, se è possibile "aggiornare" le posizioni dei link, o qualche altro metodo

Sergio

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:Db e cancellazione row
« Risposta #1 il: 09 Agosto 2011, 14:19:28 CEST »
+1
c'è il cursor.requery()
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 sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Db e cancellazione row
« Risposta #2 il: 09 Agosto 2011, 14:41:56 CEST »
0
grazie Nicola...avevo provato già.... ma con nessun risultato..
so che sicuramente è questa la soluzione al mio problema, ma sicuramente sbaglio qualche impostazione o la posizione del cursor.requery( il "controllo" delle row del database avviene dentro asynctask  -doInBackground -

il mio
Codice (Java): [Seleziona]
cursor = db.getTitle(numero_riferimento) è in funzione di un numero di riferimento che parte da 1 e arriva fino a 10.
devo fare in modo da far saltare al cursore il numero 4(ad esempio) o l'app va in crash.

ho provato tra l'altro qualcosa del tipo "   if (cursor==null)  {cursor.requery()  };
continuo e vi tengo aggiornati
Sergio

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:Db e cancellazione row
« Risposta #3 il: 09 Agosto 2011, 15:06:52 CEST »
0
se vuoi piu aiuto,posta un po di codice, dell'inizializzazione del cursor e del doInBackground dell'async task
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 sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Db e cancellazione row
« Risposta #4 il: 09 Agosto 2011, 16:49:43 CEST »
0
certo Nicola, allora per quanto riguarda il codice, nella classe DBAdapter ho :
ho anche letto che il cursor.requery è deprecato..potrebbe essere questo il motivo?

Codice (Java): [Seleziona]
    public Cursor getTitle(long rowId) throws SQLException
    {
        Cursor mCursor =
                db.query(true, DATABASE_TABLE, new String[] {
                                KEY_ROWID,                     
                                KEY_TITLE,                             
                                },
                                KEY_ROWID + "=" + rowId,
                                null,
                                null,
                                null,
                                null,
                                null);
        if (mCursor != null) {
   
            mCursor.moveToFirst();
        }
       
        return mCursor;
    }


per quanto riguarda l'activity principale, nell'async task ho questo:

Codice (Java): [Seleziona]
 public class InitTask extends AsyncTask<Context, Integer, String>
          {    
                 
           ProgressDialog dialog;
        @Override
          protected String doInBackground(Context... params )
                   {
                 int x = 0;
                 rif=1;                                
                cursor_length = c.getCount();        
                     
                     for ( x = 0; x < cursor_length; x++)//inizio il ciclo
                         {                       
                          c = db.getTitle(rif); //recupero il valore del titolo        
                           
                      Log.i("makemachine", "totale: "+cursor_length+ " valore x: "+x+" rif :"+rif );

                      if (isWifi) ///se il wifi è on, allora recupera le immagini
                         {                       
                                   bmOptions = new BitmapFactory.Options();
                                   bmOptions.inSampleSize = 15;                                
                                   bm=(LoadImageFromWeb(c.getString(1),bmOptions));                      
                                   Log.i("makemachine", c.getString(1));                     // cosi ottengo tramite logcat l'url di ciascuna row    
                                           
                                   publishProgress(rif);                                             
                               }
                            else{  //se il wifi non è attivo, vai solo avanti col progress, senza scaricare nulla.
                                cursor_length = 0;
                                 startActivity(new Intent("com.android.software.DIALOG"));
                                          finish();                                              
                                }                                                    
                           rif = rif+1;    //incremento il valore di uno e ricomincia il ciclo per l'immagine successiva                 
                                         }
                     //fine ciclo              
                                return "COMPLETE!";
                   
                   
                   }                   
                           
                   @Override
                   protected void onPreExecute()
                   {
                    db.open();  //qui apro il DB               
                    c = db.getAllTitles();     
                    c.moveToFirst();
                    cursor_length = c.getCount();
                    ................
                 


questo è tutto quello che riguarda il cursor, sicuramente sbaglio qualcosa nell'inizializzazione

dimenticavo... la cancellazione avviene tramite:

Codice (Java): [Seleziona]
        public void removefromdb(int j){               
            db.open();
         boolean id;       
        id = db.deleteTitle(j);
        c = db.getAllTitles();
       
    //  Toast.makeText(Favourite.this, "DELETED string"+c.getString(1), Toast.LENGTH_SHORT).show();
          finish();
}        

richiamando il metodo:  removefromdb(rif);  da un pulsante
« Ultima modifica: 09 Agosto 2011, 17:07:11 CEST da sergioandroid »

Offline sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Db e cancellazione row
« Risposta #5 il: 10 Agosto 2011, 00:42:41 CEST »
0
confido in un vostro consiglio, perchè dopo 7 ore di lavoro e ricerca di errori, ho totalmente esaurito le idee  :'( :'( :'(

ormai ho ben chiaro cosa accade :
[1] ---> [2] ---> [3] ---> [4] ---> [5] ---> [6] 

se elimino ad esempio il valore 4, il cursore mi crasha non appena raggiunge la row vuota:
[1] ---> [2] ---> [3] ---> [  ] ---> [5] ---> [6] 

e il salto dal 3 al 5 non avviene in maniera automatica come speravo, il cursor.requery() mi risulta deprecato

Sergio


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:Db e cancellazione row
« Risposta #6 il: 10 Agosto 2011, 09:08:55 CEST »
+1
allora, il tuo codice non mi riflette per niente l'errore:
Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at com.android.software.wallpaperfull.Favourite$InitTask.doInBackground(Favourite.java:618)
08-09 13:08:43.973: ERROR/AndroidRuntime(9074):     at com.android.software.wallpaperfull.Favourite$InitTask.doInBackground(Favourite.java:1)

tu fai un getString sul cursor (in riga 618) dandogli index 0, quando non ci sono elementi (colonne se capisco bene l'errore),ma nel codice non fai nulla di simile...
poi te ad ogni elemento del cursor fai (perché?) un nuovo get da db... dovresti fare un c.getTitle PRIMA del for, e non ogni volta dentro il for (perchè in quel caso il cursore si riaggiorna ad ogni ciclo del for!
poi ogni volta che ottieni il cursore, prima di fare il moveToFirst fai lo startManagingCursor.
ad ogni modo, gentilmente formatta il codice prima di pubblicarlo perchè senno non si capisce niente...
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 sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Db e cancellazione row
« Risposta #7 il: 11 Agosto 2011, 15:45:07 CEST »
0
ad ogni modo, gentilmente formatta il codice prima di pubblicarlo perchè senno non si capisce niente...
hai ragione, sto problema mi sta facendo perdere parecchia lucidità.

poi te ad ogni elemento del cursor fai (perché?) un nuovo get da db... dovresti fare un c.getTitle PRIMA del for, e non ogni volta dentro il for (perchè in quel caso il cursore si riaggiorna ad ogni ciclo del for!
Anche qui hai ragione.. ma non riesco a far spostare il cursore tramite cursor.moveToNext().
Ho fatto un pò di pulizia in tutto.

- Nella classe DBAdapter ho creato il metodo GetTitle(), e chiaramente questo posiziona subito il cursore alla prima row, tramite "moveToFirst".

Codice (Java): [Seleziona]
public Cursor getTitle(int rowId) throws SQLException
        {
                Cursor mCursor =
                        db.query(true, DATABASE_TABLE, new String[] { KEY_ROWID,KEY_TITLE },  KEY_ROWID + "=" + rowId,
                        null,
                        null,
                        null,
                        null,
                        null);
               
                if (mCursor != null)
                {      
                  mCursor.moveToFirst();
                }
                return mCursor;
        }


nell'AsyncTask precisamente in onPreExecute, ho scritto:
 
Codice (Java): [Seleziona]
protected void onPreExecute()
                {
                        db.open();
                        c = db.getAllTitles();  
                        cursor_length = c.getCount();          
                        startManagingCursor(c);                

                        dialog = new ProgressDialog(Favourite.this);
                        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                        dialog.setMessage("Looking for favourites...please wait");                       
                        dialog.setMax(cursor_length);
                        dialog.setCancelable(false);
                        dialog.show();

                        //  c.close();

                        Log.i( "makemachine", "onPreExecute()" );
                        super.onPreExecute();                    
                }


e finalmente, nel doInBackground, ho fatto un pò di pulizia, seguendo il tuo suggerimento e inserendo un solo c.GetTitle:

Codice (Java): [Seleziona]
protected String doInBackground(Context... params )
                {
                        int x = 0;
                        rif=1;         
                        c = db.getTitle(rif);  
 
                        for ( x = 0; x < cursor_length; x++)//inizio il ciclo
                        {                                      
                                Log.i("makemachine", "totale: "+cursor_length+ " valore x: "+x+" rif :"+rif);

                                if (isWifi)
                                {
                                        bmOptions = new BitmapFactory.Options();
                                        bmOptions.inSampleSize = 15;                     
                                        bm=(LoadImageFromWeb(c.getString(1),bmOptions));       
                                        Log.i("makemachine", c.getString(1));  
                                        publishProgress(rif);                
                                }
                                else{                                  
                                        startActivity(new Intent("com.android.software.DIALOG"));
                                        finish();                                                        
                                }      
                                                               
                                rif = rif+1;   
                                c.moveToNext();
                        }
                        //fine ciclo

                        Log.i( "makemachine", "valore count: "+cursor_length);
                        Log.i( "makemachine", "onBACKGROUND()" );
                        return "COMPLETE!";                      
                }                      

a fine ciclo, il cursore dovrebbe "spostarsi" alla row successiva, invece il logcat mi dice(questa volta index e size hanno valore 1):
Codice (Java): [Seleziona]
08-11 15:42:06.485: ERROR/AndroidRuntime(7980): Caused by: android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
08-11 15:42:06.485: ERROR/AndroidRuntime(7980):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
08-11 15:42:06.485: ERROR/AndroidRuntime(7980):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
08-11 15:42:06.485: ERROR/AndroidRuntime(7980):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
08-11 15:42:06.485: ERROR/AndroidRuntime(7980):     at com.android.software.wallpaperfull.Favourite$InitTask.doInBackground(Favourite.java:620)
08-11 15:42:06.485: ERROR/AndroidRuntime(7980):     at com.android.software.wallpaperfull.Favourite$InitTask.doInBackground(Favourite.java:1)



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:Db e cancellazione row
« Risposta #8 il: 11 Agosto 2011, 16:07:05 CEST »
0
qual è la riga 620?
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 sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Db e cancellazione row
« Risposta #9 il: 11 Agosto 2011, 16:11:40 CEST »
0
esattamente questa:

Codice (Java): [Seleziona]
bm=(LoadImageFromWeb(c.getString(1),bmOptions));
c.getString(1) non è altro che una stringa recuperata dal DB.. il mio Db è praticamente una lunga lista di URL

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:Db e cancellazione row
« Risposta #10 il: 11 Agosto 2011, 16:48:43 CEST »
0
esattamente questa:

Codice (Java): [Seleziona]
bm=(LoadImageFromWeb(c.getString(1),bmOptions));
c.getString(1) non è altro che una stringa recuperata dal DB.. il mio Db è praticamente una lunga lista di URL
c.getString vuol dire:
Citazione
Dammi la stringa che c'è alla colonna 1 (quindi la seconda colonna) alla posizione attuale del cursor

questo va bene se il risultato della query che fai ti da due colonne e la seconda è una stringa, altrimenti l'errore è li!

se ancora hai problemi, prenditi fuori il database e prova a fare la query a mano e vedi che risultati ti escono. In tal caso prova a fare una raw query invece che la prepared.
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 sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Db e cancellazione row
« Risposta #11 il: 11 Agosto 2011, 17:15:14 CEST »
0
questo va bene se il risultato della query che fai ti da due colonne e la seconda è una stringa, altrimenti l'errore è li!

su quello credo sia ok! ogni riga è infatti formata da due colonne, una è l'id, l'altra è la stringa degli URL.. e il primo valore stringa, appunto un url, al primo ciclo mi viene infatti dato senza problemi.
Il secondo valore (index 1, size 1) invece fa crashare l'app, in quanto inaccessibile.
il mio problema è semplicemente "l'aggiornamento" della posizione del cursore, che non sembra muoversi alle righe successive

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:Db e cancellazione row
« Risposta #12 il: 11 Agosto 2011, 18:43:24 CEST »
0
allora fai cosi:
invece che il ciclo for, fai un
while (cursor.moveToNext())
e togli il moveToNext in fondo al ciclo for...
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 sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Db e cancellazione row
« Risposta #13 il: 11 Agosto 2011, 20:47:22 CEST »
0
grazie per la pazienza Nicola.. forse dovrei rinominare il titolo del post in: Spostamento cursor tra le varie row.

spiego brevemente
ho fatto come hai suggerito ma nulla:

Codice (Java): [Seleziona]
protected String doInBackground(Context... params )
                {      
                        int x = 0;
                        rif=1;                                                 
                        c = db.getTitle(rif);
                        startManagingCursor(c);                        
                        while (c.moveToNext())
                        {                                      
                                Log.i("makemachine", "totale: "+cursor_length+ " valore x: "+x+" rif :"+rif);
                                Log.i("makemachine", "posizione o : "+c.getPosition());                        
                                Log.i("makemachine", "posizione: "+c.getPosition());
                                publishProgress(rif);                          
                                rif = rif+1;
                        }
                        //fine ciclo
                        Log.i( "makemachine", "Numero row: "+cursor_length);
                        Log.i( "makemachine", "onBACKGROUND()" );
                        return "COMPLETE!";                      
                }

mi ha ritornato questo in logcat..leggendo quindi il totale delle row, ma nulla di più.
Codice (Java): [Seleziona]
08-11 20:31:31.191: INFO/makemachine(13599): onPreExecute()
08-11 20:31:31.201: INFO/makemachine(13599): numero row: 5
08-11 20:31:31.212: INFO/makemachine(13599): onBACKGROUND()
08-11 20:31:31.242: INFO/makemachine(13599): onPostExecute(): COMPLETE!

la cosa curiosa invece è che ho semplificato il ciclo for lasciando solo istruzioni di log per andare spedito e cercare la posizione del cursore..la cosa che ho notato è che non va piu avanti della prima posizione, del primo _id(dovrebbero essere 5)

Codice (Java): [Seleziona]
public class InitTask extends AsyncTask<Context, Integer, String>
        {
                ProgressDialog dialog;
                @Override
                protected String doInBackground(Context... params )
                {
                        int x = 0;
                        rif=1;                                                         
                        c = db.getTitle(rif);
                        startManagingCursor(c);

                        for ( x = 0; x < cursor_length; x++)//inizio il ciclo
                        {                                      
                                Log.i("makemachine", "totale: "+cursor_length+ " valore x: "+x+" rif :"+rif);                  

                                Log.i("makemachine", "posizione prima: "+c.getPosition()+db.KEY_ROWID);
                                rif = rif+1;
                                c.moveToNext();
                                Log.i("makemachine", "posizione adesso: "+c.getPosition()+db.KEY_ROWID);
                        }
                        //fine ciclo
                        Log.i( "makemachine", "Numero row: "+cursor_length);
                        Log.i( "makemachine", "onBACKGROUND()" );
                        return "COMPLETE!";                      
                }          

e ha ritornato questo:

Codice (Java): [Seleziona]
08-11 20:40:56.562: INFO/makemachine(13695): onPreExecute() //finita la fase di preExecute
08-11 20:40:56.612: INFO/makemachine(13695): totale: 5 valore x: 0 rif :1
08-11 20:40:56.612: INFO/makemachine(13695): posizione prima: 0_id
08-11 20:40:56.612: INFO/makemachine(13695): posizione adesso: 1_id
08-11 20:40:56.612: INFO/makemachine(13695): totale: 5 valore x: 1 rif :2
08-11 20:40:56.612: INFO/makemachine(13695): posizione prima: 1_id
08-11 20:40:56.612: INFO/makemachine(13695): posizione adesso: 1_id
08-11 20:40:56.612: INFO/makemachine(13695): totale: 5 valore x: 2 rif :3
08-11 20:40:56.612: INFO/makemachine(13695): posizione prima: 1_id
08-11 20:40:56.612: INFO/makemachine(13695): posizione adesso: 1_id
08-11 20:40:56.622: INFO/makemachine(13695): totale: 5 valore x: 3 rif :4
08-11 20:40:56.622: INFO/makemachine(13695): posizione prima: 1_id
08-11 20:40:56.632: INFO/makemachine(13695): posizione adesso: 1_id
08-11 20:40:56.632: INFO/makemachine(13695): totale: 5 valore x: 4 rif :5
08-11 20:40:56.641: INFO/makemachine(13695): posizione prima: 1_id
08-11 20:40:56.641: INFO/makemachine(13695): posizione adesso: 1_id
08-11 20:40:56.652: INFO/makemachine(13695): Numero row: 5
08-11 20:40:56.652: INFO/makemachine(13695): onBACKGROUND()
08-11 20:40:56.902: INFO/makemachine(13695): onPostExecute(): COMPLETE!

stessa cosa se al posto di moveToNext uso moveToPosition... se assegno ad esempio il valore 3 (c.moveToPosition(3) l'id ritornato è sempre il primo.. eppure come puoi vedere il totale delle row sono 5.. mi sa che è questo il vero problema.
Ogni row ha due colonne, la 0 per l'id e la 1 per le stringhe(in questo caso URL).

Offline sergioandroid

  • Nuovo arrivato
  • *
  • Post: 49
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
Re:Db e cancellazione row
« Risposta #14 il: 11 Agosto 2011, 23:53:46 CEST »
0
il caldo qui in sicilia fa davvero brutti scherzi!
mi scuso del tempo che ti ho fatto perdere, ma era davvero tutto cosi banale, che mi sto mangiando le mani dal tempo perso!
l'errore era questo   : c = db.getAllTitles(); al posto di  c = db.getTitle(rif);

Codice (Java): [Seleziona]
protected String doInBackground(Context... params )
                {
                        int x = 0;
                        rif=1;        
                        c = db.getTitle(rif);  ////// SBAGLIATO!   deve essere c = db.getAllTitles();

 
                        for ( x = 0; x < cursor_length; x++)//inizio il ciclo
                        {                                      
                                Log.i("makemachine", "totale: "+cursor_length+ " valore x: "+x+" rif :"+rif);

                              ....
                                                               
                                rif = rif+1;  
                                c.moveToNext();
                        }
                        //fine ciclo.....
                 
                     

a fine PreExecute, il cursore che faceva il get totale delle row, veniva sostituito dal singolo (appunto  c = db.getTitle(rif); ) che faceva riferimento a una sola posizione.. da qui un solo id!

Va da sè che l'originale questione della cancellazione, è andata liscia e tutto è stato risolto.
Grazie mille, di cuore!
Un buon ferragosto a tutto il forum!