Android:我需要关闭光标对象吗?

Android:我需要关闭光标对象吗?,android,sqlite,Android,Sqlite,在我的数据库适配器类中,我有许多这样的方法: 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 })

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

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(),我不确定这是否是一个问题。是否关闭游标并释放游标中的资源。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;
}

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

是的,建议在使用该游标对象时关闭游标,以便游标可以在关闭时执行其希望执行的任何内部管理工作。

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


请参考此

这并没有回答问题。close()在finalize()方法中被调用,但这并不意味着我们不需要关闭光标!事实上,我们必须在使用完光标后关闭光标。为什么?因为我们不知道finalize()方法何时被调用,或者最糟糕的是,我们不知道它是否被调用。java根本不授权finalize()方法的执行!!还有其他原因,比如finalize()方法中运行代码的性能问题和异常处理问题(finalize方法中不可能有异常处理)。那么为什么google开发人员将close()放在finalize()中呢?很简单:他们认为如果某个懒惰的开发人员忘记调用close()的话他们应该释放资源,即使时间晚了,而且不能保证。总比什么都没有好。正确的?总之,应该始终调用close()。您还可以在关闭光标后将其设置为null。它允许垃圾收集器更快地将其从内存中删除,但我不推荐使用它,因为它只是一个java对象,这样做的性能提升不会改变任何事情。