2012-12-02 13 views
9

Ho qualche problema ad aggiornare il mio database.SQLiteException "impossibile eseguire il commit - nessuna transazione è attiva" durante l'inserimento con CONFLICT_REPLACE

Questo è il log:

12-02 16:18:57.502: D/Data Update(21218): Start updating databases 
12-02 16:18:57.502: D/Data Update(21218): update size: 5 
12-02 16:18:57.502: D/Data Update(21218): updating table cemeteries 
12-02 14:28:51.877: I/SqliteDatabaseCpp(18826): sqlite returned: error code = 1802, msg = statement aborts at 13: [INSERT OR REPLACE INTO cemeteries(id,name) VALUES (?,?)] , db=/data/data/de.l_one.app.shaufelv14/databases/poidatabase 
12-02 14:28:51.877: E/SQLiteStatementCpp(18826): native_execute (step): errno = 2, error message = No such file or directory, handle = 0xdc0b70 
12-02 14:28:51.877: I/SqliteDatabaseCpp(18826): sqlite returned: error code = 1, msg = statement aborts at 2: [COMMIT;] cannot commit - no transaction is active, db=/data/data/de.l_one.app.shaufelv14/databases/poidatabase 
12-02 14:28:51.887: E/Data Update(18826): Update failed 
12-02 14:28:51.887: E/Data Update(18826): android.database.sqlite.SQLiteException: cannot commit - no transaction is active 
12-02 14:28:51.887: E/Data Update(18826): at android.database.sqlite.SQLiteStatement.native_executeSql(Native Method) 
12-02 14:28:51.887: E/Data Update(18826): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:90) 
12-02 14:28:51.887: E/Data Update(18826): at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:2006) 
12-02 14:28:51.887: E/Data Update(18826): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1946) 
12-02 14:28:51.887: E/Data Update(18826): at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:764) 
12-02 14:28:51.887: E/Data Update(18826): at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:273) 
12-02 14:28:51.887: E/Data Update(18826): at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:115) 
12-02 14:28:51.887: E/Data Update(18826): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1807) 
12-02 14:28:51.887: E/Data Update(18826): at de.l_one.app.shaufelv14.DataUpdater.update(DataUpdater.java:102) 
12-02 14:28:51.887: E/Data Update(18826): at de.l_one.app.shaufelv14.MainActivity$5.run(MainActivity.java:104) 

Questo è il codice che uso per inserire nuovi dati:

int updateSize = 0; 

// cvs is an ArrayList<ContentValues> array with each entry holding 
// the new values for a certain table 
// I know I could use a Map but let's change one thing after another 

for(ArrayList<ContentValues> list : cvs) 
    updateSize += list.size(); 

Log.d(DEBUG_TAG, "Start updating databases"); 
Log.d(DEBUG_TAG, "update size: "+updateSize); 

if(updateSize > 0) { 

    dbHelper = ShaufelDatabaseHelper.getInstance(context); 
    connection = dbHelper.getWritableDatabase(); 

    for(int i=0; i<cvs.length; i++) { 
     String table; 
     switch(i) { 
      case 0: table = "cemeteries"; break; 
      case 1: table = "customers"; break; 
      case 2: table = "graves"; break; 
      case 3: table = "orders"; break; 
      case 4: table = "plants"; break; 
      case 5: table = "plantevents"; break; 
      case 6: table = "services"; break; 
      case 7: table = "serviceevents"; break; 
      default: throw new RuntimeException("wtf"); 
     } 
     Log.d(DEBUG_TAG, "updating table "+table); 

     for(ContentValues cv: cvs[i]) { 
      // replace updated values, insert new ones 
      connection.insertWithOnConflict(table, null, cv, SQLiteDatabase.CONFLICT_REPLACE); 
     } 
    } 
} 

La cosa strana di questo è che l'eccezione non è gettato ogni volta. È più simile a questa:

Se si avvia l'app e si accede, l'aggiornamento funziona. Se si effettua il logout e si torna indietro (senza chiudere l'app), l'aggiornamento si ripete ma questa volta con l'eccezione.
Se chiudi l'app (non solo premendo a casa ma forzando la chiusura con il sistema Android) funzionerà di nuovo fino al logout e al ritorno.
Gli aggiornamenti contengono tutti gli stessi dati (stiamo attualmente testando questa roba) ed è gestito dallo stesso codice e tuttavia funziona solo la metà del tempo.

Questo viene eseguito su Android 4.0.3 su un HTC Sensation.

risposta

0

1802 è SQLITE_IOERR_FSTAT, che si verifica quando il file di database viene eliminato mentre una connessione è ancora aperta.

Stai facendo qualche tipo di eliminazione di file nel tuo aggiornamento?

+0

Sì, ma non dovrebbe succedere lì. Anche questo comparirebbe nel registro. Ad ogni modo, ho preso quella parte ma non è cambiato nulla, stessa eccezione. – IchBinKeinBaum

Problemi correlati