IllegalStateException:尝试重新打开一个已经关闭的对象:使用 Loader 的 SQLiteDatabase
IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase using Loader
日志状态:
W/Filter(1629): An exception occured during performFiltering()!
W/Filter(1629): java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.example.bazadanych/databases/MyDb
W/Filter(1629): at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
W/Filter(1629): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1156)
W/Filter(1629): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
W/Filter(1629): at com.example.bazadanych.DBAdapter.fetchCountriesByName(DBAdapter.java:186)
W/Filter(1629): at com.example.bazadanych.MainActivity.runQuery(MainActivity.java:74)
W/Filter(1629): at android.support.v4.widget.CursorAdapter.runQueryOnBackgroundThread(CursorAdapter.java:397)
W/Filter(1629): at android.support.v4.widget.CursorFilter.performFiltering(CursorFilter.java:50)
W/Filter(1629): at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
W/Filter(1629): at android.os.Handler.dispatchMessage(Handler.java:102)
W/Filter(1629): at android.os.Looper.loop(Looper.java:136)
W/Filter(1629): at android.os.HandlerThread.run(HandlerThread.java:61)
因为在主题中,当我返回列表视图时说游标已关闭,过滤器没有过滤。
使用加载程序后留下的唯一问题,过滤器在移动到详细信息 activity 并返回到 listview
后不过滤。有什么想法吗?
这是过滤器:
public static Cursor fetchCountriesByName(String inputText) throws SQLException {
Log.w(TAG, inputText);
Cursor c = null;
if (inputText == null || inputText.length () == 0) {
c = db.query(DATABASE_TABLE, new String[] {KEY_ROWID,
KEY_NAME, KEY_COUNTRY, KEY_REGION, KEY_PHONE},
null, null, null, null, null);
} else {
c = db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
KEY_NAME, KEY_COUNTRY, KEY_REGION, KEY_PHONE},
KEY_NAME + " like '%" + inputText + "%'", null,
null, null, null, null);
}
if (c != null) {
c.moveToFirst();
}
return c;
}
从您的 MainActivity.class
中删除它
@Override
protected void onDestroy() {
super.onDestroy();
closeDB();
}
Varun 很接近,给了我一个线索,我一直在遵循。
使用 CursorLoader 帮助解决了在列表视图中填充数据库的问题,现在加载没有问题,感谢@Selvin。
问题显然是关闭游标,但正如我提到的,它只是在移动到另一个我也在使用数据库的 activity 之后发生,并且数据库已关闭,这影响了获取数据的可能性返回列表视图后再次在列表视图中使用游标,但关闭后无法重新获取。
问题是:db.close();
不在列表视图活动中,而是在另一个 activity 中。感谢您的帮助。
日志状态:
W/Filter(1629): An exception occured during performFiltering()!
W/Filter(1629): java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.example.bazadanych/databases/MyDb
W/Filter(1629): at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
W/Filter(1629): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1156)
W/Filter(1629): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
W/Filter(1629): at com.example.bazadanych.DBAdapter.fetchCountriesByName(DBAdapter.java:186)
W/Filter(1629): at com.example.bazadanych.MainActivity.runQuery(MainActivity.java:74)
W/Filter(1629): at android.support.v4.widget.CursorAdapter.runQueryOnBackgroundThread(CursorAdapter.java:397)
W/Filter(1629): at android.support.v4.widget.CursorFilter.performFiltering(CursorFilter.java:50)
W/Filter(1629): at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
W/Filter(1629): at android.os.Handler.dispatchMessage(Handler.java:102)
W/Filter(1629): at android.os.Looper.loop(Looper.java:136)
W/Filter(1629): at android.os.HandlerThread.run(HandlerThread.java:61)
因为在主题中,当我返回列表视图时说游标已关闭,过滤器没有过滤。
使用加载程序后留下的唯一问题,过滤器在移动到详细信息 activity 并返回到 listview
后不过滤。有什么想法吗?
这是过滤器:
public static Cursor fetchCountriesByName(String inputText) throws SQLException {
Log.w(TAG, inputText);
Cursor c = null;
if (inputText == null || inputText.length () == 0) {
c = db.query(DATABASE_TABLE, new String[] {KEY_ROWID,
KEY_NAME, KEY_COUNTRY, KEY_REGION, KEY_PHONE},
null, null, null, null, null);
} else {
c = db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
KEY_NAME, KEY_COUNTRY, KEY_REGION, KEY_PHONE},
KEY_NAME + " like '%" + inputText + "%'", null,
null, null, null, null);
}
if (c != null) {
c.moveToFirst();
}
return c;
}
从您的 MainActivity.class
中删除它@Override
protected void onDestroy() {
super.onDestroy();
closeDB();
}
Varun 很接近,给了我一个线索,我一直在遵循。
使用 CursorLoader 帮助解决了在列表视图中填充数据库的问题,现在加载没有问题,感谢@Selvin。
问题显然是关闭游标,但正如我提到的,它只是在移动到另一个我也在使用数据库的 activity 之后发生,并且数据库已关闭,这影响了获取数据的可能性返回列表视图后再次在列表视图中使用游标,但关闭后无法重新获取。
问题是:db.close();
不在列表视图活动中,而是在另一个 activity 中。感谢您的帮助。