首页 > 解决方案 > 如何在android中解决“尝试重新打开关闭的SQLite数据库”

问题描述

我一直在构建一个使用 SQLiteOpenHelper 来管理 SQLite 数据库的 android 应用程序。应用程序 SQLite 的数据库运行良好,我似乎可以找到任何错误,并且我检查了我是否调用new SQLiteOpenHelper().close()了每个 SQLite 数据库操作以防止数据泄漏。但是几个月后,我收到一条错误消息,告诉我我正在尝试重新打开一个已经关闭的 SQLite 数据库。但是我仔细检查了所有内容,似乎找不到任何问题。我很困惑可能是什么问题。任何帮助表示赞赏。提前致谢。

编辑

这是产生错误的代码。Android Studio 在 where 行报告错误;

Cursor result = db.rawQuery(selectStmt, null)存在。

public List<DataModel> getAssignmentData() {

        List<DataModel> data = new ArrayList<>();
        SQLiteDatabase db = getReadableDatabase();
        String selectStmt
                = "SELECT " + COLUMN_ASSIGNMENT_TITLE + ", "
                + COLUMN_SUBMISSION_DATE + ", "
                + COLUMN_ASSIGNMENT_DESCRIPTION + ", "
                + COLUMN_LECTURER_NAME + ", "
                + COLUMN_COURSE_CODE + ", "
                + COLUMN_ATTACHED_IMAGE + ", "
                + COLUMN_ID + ", "
                + COLUMN_SUBMITTED + " FROM " + ASSIGNMENT_TABLE;

        Cursor result = db.rawQuery(selectStmt, null);

        if (result.moveToFirst()) {
            do {
                String title = result.getString(0);
                String date = result.getString(1);
                String description = result.getString(2);
                String lecturerName = result.getString(3);
                String course = result.getString(4);
                String attachedImages = result.getString(5);
                int id = result.getInt(6);
                boolean submitted = result.getInt(7) == 1;

                AssignmentModel assignment = new AssignmentModel();
                assignment.setTitle(retrieveEntry(title));
                assignment.setDate(date);
                assignment.setDescription(retrieveEntry(description));
                assignment.setLecturerName(retrieveEntry(lecturerName));
                assignment.setCourseCode(course);
                assignment.setAttachedImage(attachedImages);
                assignment.setPosition(id);
                assignment.setSubmitted(submitted);

                data.add(assignment);
            } while (result.moveToNext());

        }
        result.close();
        return data;
    }

标签: javaandroiddatabasesqlite

解决方案


AndroidSQLiteDatabase内部有一个简单的引用计数。new SQLiteOpenHelper()构造函数调用不会打开数据库,即增加引用计数,但调用close()会减少它,可能会SQLiteDatabase因其他原因使您打开的引用无效。

与其close()与构造函数调用配对,不如将它们与数据库的实际打开配对,例如getWritableDatabase()or getReadableDatabase()。如果您发布更多代码,我们可以为您提供更好的帮助。


推荐阅读