I am trying to update a single SQLite row item multiple times in a thread.But it throwing close() was never explicitly called on database error.. I did my logic like below:
ta.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {}
@Override
public void afterTextChanged(final Editable s) {
// TODO Auto-generated method stub
Thread textThread = new Thread(new Runnable() {
@Override
public void run() {
mValues.open();
mValues.updateText(id, s.toString());
mValues.close();
}
});textThread.start();
Editor edittextEditor = checkPrefs.edit();
edittextEditor.putString(IncidentQuestionPage.EDITTEXT_KEY+id, s.toString());
edittextEditor.commit();
}
});
updateText(),open() and close() from DB:
public IncidentValues open() throws SQLException {
ourHelper = new DbHelper(context);
ourDatabase = ourHelper.getWritableDatabase();
return this;
}
public void close() {
ourHelper.close();
}
public void updateText(String optionId, String text){
ContentValues data=new ContentValues();
data.put(VALUE, text);
ourDatabase.update(INCIDENT_VALUES_TABLE, data, INCIDENT_OPTION_ID+"=?", new String[] {optionId});
}
The Logcat after changing data in EditText:
02-14 13:36:36.059: E/SQLiteDatabase(3679): close() was never explicitly called on database '/data/data/com.mondaz.globalfocusfocalpoint/databases/IncidentValues'
02-14 13:36:36.059: E/SQLiteDatabase(3679): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
02-14 13:36:36.059: E/SQLiteDatabase(3679): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1944)
02-14 13:36:36.059: E/SQLiteDatabase(3679): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1007)
02-14 13:36:36.059: E/SQLiteDatabase(3679): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
02-14 13:36:36.059: E/SQLiteDatabase(3679): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1051)
02-14 13:36:36.059: E/SQLiteDatabase(3679): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:800)
02-14 13:36:36.059: E/SQLiteDatabase(3679): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
02-14 13:36:36.059: E/SQLiteDatabase(3679): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
02-14 13:36:36.059: E/SQLiteDatabase(3679): at com.mondaz.globalfocusfocalpoint.localDb.IncidentValues.open(IncidentValues.java:62)
02-14 13:36:36.059: E/SQLiteDatabase(3679): at com.mondaz.globalfocusfocalpoint.adapter.IncidentQuestionAdapter$2$1.run(IncidentQuestionAdapter.java:221)
02-14 13:36:36.059: E/SQLiteDatabase(3679): at java.lang.Thread.run(Thread.java:856)
02-14 13:36:36.060: E/System(3679): Uncaught exception thrown by finalizer
02-14 13:36:36.061: E/System(3679): java.lang.IllegalStateException: Don't have database lock!
02-14 13:36:36.061: E/System(3679): at android.database.sqlite.SQLiteDatabase.verifyLockOwner(SQLiteDatabase.java:2091)
02-14 13:36:36.061: E/System(3679): at android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2183)
02-14 13:36:36.061: E/System(3679): at android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2179)
02-14 13:36:36.061: E/System(3679): at android.util.LruCache.trimToSize(LruCache.java:197)
02-14 13:36:36.061: E/System(3679): at android.util.LruCache.evictAll(LruCache.java:285)
02-14 13:36:36.061: E/System(3679): at android.database.sqlite.SQLiteDatabase.deallocCachedSqlStatements(SQLiteDatabase.java:2144)
02-14 13:36:36.061: E/System(3679): at android.database.sqlite.SQLiteDatabase.closeClosable(SQLiteDatabase.java:1126)
02-14 13:36:36.061: E/System(3679): at android.database.sqlite.SQLiteDatabase.finalize(SQLiteDatabase.java:1915)
02-14 13:36:36.061: E/System(3679): at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:182)
02-14 13:36:36.061: E/System(3679): at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:168)
02-14 13:36:36.061: E/System(3679): at java.lang.Thread.run(Thread.java:856)
I have tried by putting Thread.sleep(1000) inside the thread, but it didn't work.
Please suggest how to handle this multiple database objects..
ourDatabase.close();..I have closed thedbHelperi.eSQLiteOpenHelper..