2015-09-05 120 views
1

当我从教程中看到示例时,我发现getReadableDatabase db在最后没有关闭,但对于​​,它总是在最后关闭。这是为什么?即使是文档也指定我必须致电​​。我已经阅读了这两份文件,所以请不要简单地将文件引述给我。谢谢。SQLiteDatabase使用后关闭或不关闭

+0

看看'close()'是如何实现的:http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/database/sqlite/SQLiteClosable.java#105,似乎'close()'只在#of'acquireReference()'== #of'releaseReference()'时有效# – pskink

回答

-1

按照Android文档sqlite database 可写数据库“一旦成功打开,数据库缓存,所以您可以在每次需要写入到数据库时调用此方法。(请确保调用close()你不再当需要数据库)。错误的权限或完整的磁盘等错误可能会导致此方法失败,但如果问题得到解决,未来的尝试可能会成功。“

由于可写入内容一旦被打开就被缓存,这意味着它将占用内存。 如果数据库很大,那么内存很大,所以不关闭或保持打开状态可能会导致成员泄漏。

希望这有助于你:)

+0

是的,但是我看到一个问题:删除和更新通常在末尾用'close'调用覆盖。但是insert和bulkInsert不是。我个人的理解是插入不会“关闭”,因为bulkInsert的默认实现只是简单地调用insert,因此在每次迭代后调用close都可能会过度。所以有证据表明,对任何事情来说,close都是不必要的。那是对的吗?那'关闭是不必要的*?即如果我不关闭,不会造成内存泄漏? –

+0

关闭是必要的。在插入操作期间,开发人员何时关闭,因为他知道他是否需要插入更多内容。 –

+0

@Katedral Pillion请看我的编辑。 –

0

你需要保持数据库,只要有在使用中,从它包含数据的游标开放。我自己很少关闭数据库,即使使用getWriteableDatabase()

+0

正如我上面问,这是因为如果我保持数据库打开没有内存泄漏会发生? –

1

尽管文档意味着什么,有没有真正getReadableDatabase()getWritableDatabase()之间的相关差异;都打开数据库,并且该数据库保持打开状态,直到它是close() d。 所以这些例子是不正确的;他们应该以同样的方式处理这两种情况。

请注意,“当您不再需要数据库时”并不一定表示您需要在每次查询后关闭它;例如,如果某个活动可能多次访问数据库,则在活动启动时将其打开并在活动停止时将其关闭即可。

打开的数据库连接会保留一些内存为它的高速缓存,系统将停止活动,如果它需要更多的内存,所以你应该确保没有打开数据库时没有活动活动。