【发布时间】:2015-04-15 07:58:57
【问题描述】:
我试图在一个线程中多次更新单个 SQLite 行项。但它抛出 close() 从未在数据库错误时显式调用 ..我的逻辑如下:
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();
}
});
来自 DB 的 updateText()、open() 和 close():
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});
}
EditText中修改数据后的Logcat:
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)
我尝试将Thread.sleep(1000) 放入线程中,但没有成功。
请建议如何处理这多个数据库对象..
【问题讨论】:
-
“多个数据库对象”是什么意思?在您的代码中,所有线程共享一个,无需同步。
-
@CL。谢谢你的答复。如果我理解并写错了什么,我深表歉意。据我所知,每次在 EditText 中添加新文本时,线程都会调用..所以我认为它创建了一个新的数据库对象..然后每次打开它并执行更新任务并关闭..
-
@DerGolem 你能建议我在哪里使用
ourDatabase.close();..我已经关闭了dbHelper即SQLiteOpenHelper.. -
感谢您的建议……让我现在就这样做……
-
@DerGolem 否...不幸的是它显示了相同的错误..实际上该错误并没有影响我的应用程序,也没有任何强制关闭,但是在将文本放入 edittext 后显示..
标签: java android multithreading sqlite