【问题标题】:IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase using LoaderIllegalStateException:尝试重新打开已经关闭的对象:使用 Loader 的 SQLiteDatabase
【发布时间】:2016-07-14 10:47:01
【问题描述】:

日志状态:

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$2.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)

由于在主题中,当我返回 listview 说光标已关闭时,过滤器不会过滤。

使用加载器后剩下的唯一问题是,过滤器在移动到详细信息活动并返回到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;
}

【问题讨论】:

标签: android listview


【解决方案1】:

Varun 很接近并给了我一个我一直遵循的领先优势。

使用 CursorLoader 帮助解决了在列表视图中填充数据库的问题,现在它可以毫无问题地加载,这要感谢 @Selvin。

问题显然是关闭游标,但正如我提到的,它只是在移动到另一个我也在使用数据库并且数据库已关闭的活动之后才发生,这会影响支持后在列表视图中再次获取数据的可能性到列表视图,它使用了一个游标,但在关闭它之后,检索它是不可能的。

问题是:db.close(); 不在列表视图活动中,而是在其他活动中。感谢您的所有帮助。

【讨论】:

    【解决方案2】:

    从您的 MainActivity.class 中删除它

    @Override
        protected void onDestroy() {
            super.onDestroy();
            closeDB();
        }
    

    【讨论】:

    • 没用,方法是防止DB数据泄露。
    • 由于 DBAdapter 类第 186 行,在 MainActivity 第 74 行似乎有问题。请在两个类中检查这些行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    相关资源
    最近更新 更多