IllegalStateException:尝试重新打开已关闭的对象:使用Loader的SQLiteDatabase

时间:2015-03-30 11:28:05

标签: android listview

记录状态:

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后,过滤器不会进行过滤。有什么想法吗?

这是过滤器:

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;
}

2 个答案:

答案 0 :(得分:1)

Varun很接近并给了我一个我跟随的领导。

使用CursorLoader帮助解决了在listview中填充数据库的问题,现在加载没有问题,感谢@Selvin。

问题显然是关闭游标,但正如我所提到的那样,只有在转移到另一个我也在使用数据库的活动之后才发生数据库并且数据库已经关闭,这会影响在支持后在列表视图中再次获取数据的可能性使用光标的listview,但在关闭之后,无法进行调整。

问题是:db.close();不在listview活动中,而是在另一个活动中。谢谢你的帮助。

答案 1 :(得分:0)

从MainActivity.class中删除它

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