java - 如何在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;
}
解决方案
AndroidSQLiteDatabase
内部有一个简单的引用计数。new SQLiteOpenHelper()
构造函数调用不会打开数据库,即增加引用计数,但调用close()
会减少它,可能会SQLiteDatabase
因其他原因使您打开的引用无效。
与其close()
与构造函数调用配对,不如将它们与数据库的实际打开配对,例如getWritableDatabase()
or getReadableDatabase()
。如果您发布更多代码,我们可以为您提供更好的帮助。
推荐阅读
- postgresql - 准备好的语句“fooplan”已经存在
- amazon-web-services - Mac终端命令输入太长不适应?
- rust - Pin::as_mut(&mut self)
- ruby-on-rails - 在 Rails 上的模块之间共享类
- navicat - 无法访问 postgreSQL 服务器
- python - 如何将excel列写入文本文件的一列?
- python - 如何从python中的正态分布计算百分位数?
- amazon-web-services - 对 AWS 资源实施标记
- json - 如何使用 Vapor Websockets 向客户端发送字典
- vim - 如何删除高亮组?