Одна БД SQLite и две удаленные службы: android.database.sqlite.DatabaseObjectNotClosedException: - PullRequest
1 голос
/ 04 октября 2011

У меня есть ситуация, когда два удаленных сервиса обращаются к БД SQLite. Каждый сервис открывает отдельное соединение с БД и выполняет операции вставки / чтения / удаления. Службы работают нормально, кроме случаев, когда они остановлены и перезапущены снова.

Я получаю следующее исключение.

"android.database.sqlite.DatabaseObjectNotClosedException: приложение не закрывало курсор или объект базы данных, который был открыт здесь"

Я дважды проверял все операторы открытия / закрытия базы данных и операторы открытия / закрытия курсора. Я все еще получаю эту ошибку.

Кажется, я не могу указать пальцем на проблему, но похоже, что она должна что-то делать с двумя службами, одновременно обращающимися к БД, с открытыми соединениями одновременно.

Любые предложения / указатели?

У меня есть отдельные методы открытия / закрытия.

private void open() {
    m_database = m_helper.getWritableDatabase();
}

private void close() {
    if (m_database != null) {
        m_database.close();
    }
}

Для каждой операции crud я явно открываю и закрываю следующим образом.

public long insert(int type, double latitude, double longitude, long timestamp, float speed, double altitude) {
    SQLiteStatement insertStmt;
    long status;
    open();
    insertStmt = m_database.compileStatement(INSERT);
    insertStmt.bindLong(1, type);
    insertStmt.bindDouble(2, latitude);
    insertStmt.bindDouble(3, longitude);
    insertStmt.bindLong(4, timestamp);
    insertStmt.bindDouble(5, speed);
    insertStmt.bindDouble(6, altitude);

    status = insertStmt.executeInsert();
    close();
    return status;
}

Ответы [ 2 ]

1 голос
/ 23 сентября 2015

При использовании скомпилированных операторов вы захотите вызвать метод close после завершения вставки. Эти DatabaseObjectNotClosedException будут происходить много на Android 2.2, если кто-то забудет это сделать.

public long insert(int type, double latitude, double longitude, long timestamp, float speed, double altitude) {
    SQLiteStatement insertStmt;
    long status;
    open();
    insertStmt = m_database.compileStatement(INSERT);
    insertStmt.bindLong(1, type);
    insertStmt.bindDouble(2, latitude);
    insertStmt.bindDouble(3, longitude);
    insertStmt.bindLong(4, timestamp);
    insertStmt.bindDouble(5, speed);
    insertStmt.bindDouble(6, altitude);

    status = insertStmt.executeInsert();
    // call close here
    insertStmt.close();
    close();
    return status;
}
0 голосов
/ 04 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...