尝试重新打开已经关闭的对象:sqlitequery

时间:2013-09-19 23:27:14

标签: android sqliteopenhelper sqlite

所以基本上我两次查询数据库。我不明白这个错误究竟来自哪里,因为我没有在任何地方关闭数据库。返回错误的代码就是这样运行的。我查了一下,我刚看到像我这样的案子。

BeaconHandler pullAllDB = new BeaconHandler(this);
    try {
        List<Beacon> beaconsShown = pullAllDB.getAllBeacons();
        for (final Beacon bn : beaconsShown) {
            try {
                int messageCount = pullAllDB.getMessageCount();
                Log.d("Message", messageCount + " Messages Found");
                if (messageCount > 0) {
                    //Do Something
                } else {
                    // Do Nothing
                }
            } 
            catch (Exception e) {
                e.getStackTrace();
                Log.e("Message", e.getMessage());
            }
        }
    }

执行查询的代码......

public int getBeaconsCount() {

    String countQuery = "SELECT * FROM " + TABLE_BASIC_BEACON;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);
    cursor.close();

    // return count
    return cursor.getCount();

}

public int getMessageCount() {

    String mcountQuery = "SELECT * FROM " + MESSAGE_BEACON;
    SQLiteDatabase mdb = this.getReadableDatabase();
    Cursor mcursor = mdb.rawQuery(mcountQuery, null);
    mcursor.close();

    // return count
    return mcursor.getCount();

}

2 个答案:

答案 0 :(得分:19)

如果收到错误,您应该发布一个logcat。它有助于查看导致问题的行。

来自Android文档。

  

关闭()

     

关闭Cursor,释放所有资源并制作   它完全无效。

关闭后,您对mcursor.getCount()的来电可能会导致错误

也许尝试这样的事情。

int count = mcursor.getCount();
mcursor.close();

// return count
return count ;

答案 1 :(得分:1)

我假设pullAllDB是您的数据库对象,其中包含执行查询的代码。在这种情况下,在行List<Beacon> beaconsShown = pullAllDB.getAllBeacons();之前,您应该执行pullAllDB.open();之类的操作,并在完成查询后执行pullAllDB.close();

总而言之,你的功能看起来像......

try {
    //open the database class here
    pullAllDB.open();

    List<Beacon> beaconsShown = pullAllDB.getAllBeacons();
    for (final Beacon bn : beaconsShown) {
        try {
            int messageCount = pullAllDB.getMessageCount();
            Log.d("Message", messageCount + " Messages Found");
            if (messageCount > 0) {
                //Do Something
            } else {
                // Do Nothing
            }
        } 
        catch (Exception e) {
            e.getStackTrace();
            Log.e("Message", e.getMessage());
        }

    //close the database here
    pullAllDB.close();
    }
}