Autore Topic: attempt to re-open an already-closed object SQLite  (Letto 357 volte)

Offline Damien

  • Utente junior
  • **
  • Post: 63
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lenovo ZUK Z1
  • Sistema operativo:
    Windows 10
attempt to re-open an already-closed object SQLite
« il: 25 Settembre 2015, 18:07:40 CEST »
0
Buonasera a tutti, ho implementato un database seguendo questa guida: http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/
Mi funzionano tutti i metodi creati nel databasehandler a parte quello che mi dovrebbe restituire il numero di elementi (righe) presenti nel database

L'errore che mi da il logcat è questo: attempt to re-open an already-closed object: SQLiteQuery: SELECT  * FROM stanze
il metodo che ho utilizzato è questo:

Codice (Java): [Seleziona]
public int getStanzeCount() {
        String countQuery = "SELECT  * FROM " + TABLE_STANZE;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        cursor.close();

        // return count
        return cursor.getCount();
    }

Ho guardato tramite rootexplorer e il db è stato creato correttamente, gli elementi mi li aggiunge senza particolari problemi, ma mi dà questo errore che mi manda in crash l'app, sarà una cavolata sicuramente ma non riesco a capire il motivo  :-(
Se ti sono stato d'aiuto premi il tasto THANKS :)

Offline tonno16

  • Utente storico
  • *****
  • Post: 1197
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:attempt to re-open an already-closed object SQLite
« Risposta #1 il: 25 Settembre 2015, 20:28:38 CEST »
0
Non ricordo. Forse non puoi invocare il getCount() su un cursor chiuso.

Offline Damien

  • Utente junior
  • **
  • Post: 63
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lenovo ZUK Z1
  • Sistema operativo:
    Windows 10
Re:attempt to re-open an already-closed object SQLite
« Risposta #2 il: 25 Settembre 2015, 21:03:34 CEST »
0
Non ricordo. Forse non puoi invocare il getCount() su un cursor chiuso.

Quindi tu dici di non chiudere il cursore, perchè se lo mettessi dopo non ci andrebbe mai giusto? Però bisognerebbe sempre chiuderlo giusto?
Se ti sono stato d'aiuto premi il tasto THANKS :)

Offline tonno16

  • Utente storico
  • *****
  • Post: 1197
  • Respect: +58
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:attempt to re-open an already-closed object SQLite
« Risposta #3 il: 25 Settembre 2015, 21:17:29 CEST »
+1
Di Norma so. Ma se non lo chiudi non casca I'll mondo.
Ma non fraintendere... Andrebbe chiuso

Offline Damien

  • Utente junior
  • **
  • Post: 63
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lenovo ZUK Z1
  • Sistema operativo:
    Windows 10
Re:attempt to re-open an already-closed object SQLite
« Risposta #4 il: 26 Settembre 2015, 15:07:58 CEST »
0
Ho aggirato il problema guardando il numero degli elementi dell'arraylist quando mi ritorna la lista delle stanze. Grazie mille comunque  :D
Se ti sono stato d'aiuto premi il tasto THANKS :)

Offline pietroconti89

  • Utente normale
  • ***
  • Post: 164
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note 3 N9005
  • Sistema operativo:
    Windows / Mac OSX
Re:attempt to re-open an already-closed object SQLite
« Risposta #5 il: 27 Settembre 2015, 17:20:10 CEST »
0
ciao ti confermo che dovo aver invocato cursor.close() non puoi eseguire il count .... comunque ti basta fare cosi
Codice (Java): [Seleziona]
public int getStanzeCount() {
        String countQuery = "SELECT  * FROM " + TABLE_STANZE;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
       
        int count = cursor.getCount()
        cursor.close();
        // return count
        return count;
    }

comunque se non chiudi il cursor hai solo molti warning ma mai avuto un crash per quel motivo .... per pulizia si mette , saluti  ;-)