8

在我的数据库适配器类中,我有很多这样的方法:

public long getContactId(final String phoneNumber) throws SQLException {
    final Cursor cur = mDb.rawQuery(
            "select contact_id from contactphones where number=? limit 1;",
            new String[] { phoneNumber });
    return cur.moveToFirst() ? cur.getLong(0) : -1;
}

我很欣赏这种方法的简洁性。但我没有调用 Cursor.close(),我不确定这是否有问题。游标是否会在 Cursor.finalize() 中关闭并释放其资源?否则我将不得不这样做:

public long getContactId(final String phoneNumber) throws SQLException {
    final Cursor cur = mDb.rawQuery(
            "select contact_id from contactphones where number=? limit 1;",
            new String[] { phoneNumber });
    final boolean retVal = cur.moveToFirst() ? cur.getLong(0) : -1;
    cur.close();
    return retVal;
}
4

3 回答 3

2

是的,建议您在使用完该光标对象后关闭光标,以便光标可以在关闭时执行它想要执行的任何内务处理工作。

于 2012-10-22T10:06:04.127 回答
1

游标不是一个类,而是一个接口。如果您的 Cursor 对象来自 SQLite 查询,则它是 SQLiteCursor。在该定义中(\Android\android-sdk\source\android\database\sqlite\SQLiteCursor.java)close()finalize()函数中调用。这在其他游标类型中可能有所不同,因为 Cursor 接口未指定此行为。

于 2012-10-22T09:14:30.250 回答
0

不要关闭数据库。没有必要(无论如何,数据都会尽早安全地写入持久存储)。在应用程序启动时打开一次,并在应用程序的整个生命周期内重复使用相同的连接

请参考这个链接

于 2012-10-22T10:07:05.183 回答