попытка повторно открыть уже закрытый объект: sqlitequery

По сути, я дважды запрашиваю БД. Я не понимаю, откуда на самом деле эта ошибка, потому что я нигде не закрываю БД. Код, который возвращает ошибку, работает следующим образом. Я проверил вокруг, и я только что видел случай, подобный моему.

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();

}

person TheHamstring    schedule 19.09.2013    source источник


Ответы (2)


Вы должны опубликовать logcat, если вы получаете сообщение об ошибке. Это помогает увидеть, какая строка вызывает вашу проблему.

Из документации по Android.

близко()

Закрывает курсор, освобождая все его ресурсы и делая его полностью недействительным.

Ваш вызов mcursor.getCount() после того, как вы закрыли его, вероятно, вызывает ошибку

Может быть, попробовать что-то вроде этого.

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

// return count
return count ;
person Nicholas    schedule 20.09.2013
comment
Вау, не могу поверить, что сам этого не понял. Я думаю, иногда вам просто нужна еще одна пара глаз. - person TheHamstring; 20.09.2013

Я предполагаю, что 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();
    }
}
person Razgriz    schedule 20.09.2013