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.
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