【发布时间】:2013-01-01 17:16:39
【问题描述】:
在扩展 SQLiteOpenHelper 的 DatabaseHelper 类中,我设置了各种方法来将 Cursors 返回到我的其他活动,这样我就不会在除 DatabaseHelper 之外的任何其他类中执行任何查询。在这些方法中,我不会在之后关闭光标或数据库,而是像这样返回它:
public Cursor getCoursesLeft()
{
// Open a readable database.
SQLiteDatabase database = this.getReadableDatabase();
// Query the database and return the cursor.
return database.query(DEGREE_PLAN_TABLE, null, DEGREE_COLUMN_TAKEN + " = ?",
new String[] { "0" }, null, null, DEGREE_COLUMN_CLASS_NAME + " COLLATE NOCASE");
}
无论我从哪个 Activity 调用方法,我都会确保关闭使用后返回的 Cursor。
既然 Cursor 是一个对象,它应该通过引用传递,对吗?所以从其他 Activity 关闭它应该关闭原始对象,如果我理解正确,关闭 Cursor 也会关闭数据库。
这是一种糟糕的编码习惯吗?
我似乎会随机收到一个 LogCat 错误,说数据库上从未调用过 close,而我在代码中唯一能找到的可能是我如何在这些方法中返回游标的原因。
【问题讨论】:
-
它的设计相当奇怪。通常,希望一个对象或层“拥有”数据库游标,管理它们,并且只将游标“借用”到其他层,或者根本不公开它们。我会考虑从您启动它的任何地方返回整个数据库操作的结果。您还可以使用回调模式使其他类不知道游标生命周期。 (例如:static.springsource.org/spring/docs/3.0.6.RELEASE/javadoc-api/…)