Java android:为什么关闭SQLite db游标,尽管它们将在finalize方法时关闭?

Java android:为什么关闭SQLite db游标,尽管它们将在finalize方法时关闭?,java,android,cursor,sqliteopenhelper,finalize,Java,Android,Cursor,Sqliteopenhelper,Finalize,我构建了一个使用SQLiteOpenHelper的应用程序,我看到从查询中接收到的游标对象在finalize方法中自动关闭 我知道不建议依赖finalize方法,但是如果我工作正常并且没有保留对任何对象的不必要的引用(在单例、列表、异步任务等中),我不能确保所有游标对象都将被释放(在活动或片段销毁后) 我知道不建议依赖finalize方法 很好,因为这就是为什么它在finalize子句之前被关闭的原因 参考“永远不要依赖终结器来更新关键的持久状态”,因为“终结器的一个缺点是不能保证它们会立即执行

我构建了一个使用SQLiteOpenHelper的应用程序,我看到从查询中接收到的游标对象在finalize方法中自动关闭

我知道不建议依赖finalize方法,但是如果我工作正常并且没有保留对任何对象的不必要的引用(在单例、列表、异步任务等中),我不能确保所有游标对象都将被释放(在活动或片段销毁后)

我知道不建议依赖finalize方法

很好,因为这就是为什么它在finalize子句之前被关闭的原因

参考“永远不要依赖终结器来更新关键的持久状态”,因为“终结器的一个缺点是不能保证它们会立即执行”

由于关闭连接会改变持久状态(关于数据库),因此应该在终结器之前关闭连接


此外,光标对象不会自动“释放”。数据库本身是“缓存”的,因此对象本身是否被释放不会改变数据库的状态。查看更多详细信息。

不仅不能保证终结器会立即执行,也不能保证它会被执行。在关机时,JVM不会执行仍然活动的对象的终结器。Jared,你能解释一下“关闭连接是如何改变持久状态(关于数据库)”吗?关闭游标会改变什么样的持久状态?@kazag:True,但如果进程被关闭,如果某些游标没有被关闭,这还重要吗?我不知道,但可能有一些重要的事情我不知道,所以我想知道。如果您连接到远程服务器,则服务器未正确通知连接已结束。如果您处理的是本地存储,那么最终可能是一种非预期状态(并非所有状态都已刷新,某些缺少索引,锁文件仍然存在…)。