【问题标题】:To close or not to close? [closed]关闭还是不关闭? [关闭]
【发布时间】:2010-10-08 13:16:49
【问题描述】:

在过去的几天中,由于我的应用程序中的数据库泄漏,我经常收到很多错误消息,所以现在我打开数据库,从中获取查询结果并再次关闭数据库。

但我还为我的自动完成文本视图使用了光标适配器。

我是否也应该这样做:打开数据库,获取光标,关闭数据库?!

我的意思是,我没有因为不这样做而遇到任何问题,但是......

所以我需要专家的建议,你的建议

【问题讨论】:

    标签: android sqlite cursor


    【解决方案1】:

    您应该能够在 onCreate 方法中打开数据库并在 onDestroy 方法中关闭它。这将保证只要 Activity 处于“活动状态”,它就可以使用,并且最终会被清理掉。

    此外,您可能应该在与适配器一起使用的光标上使用“startManagingCursor”。这将确保它在暂停、恢复和销毁时分别被停用、重新查询和关闭。适配器中未使用的游标应在您完成从它们获取数据后立即关闭。

    如果你遵守这些规则,应该不会有泄漏。

    【讨论】:

    • 我不懂谷歌的人。他们提供了一些使用数据库或游标的教程(例如,记事本教程)。我从未见过任何用于游标或数据库的关闭方法......我也尝试过 startManagingCursor,但我遇到了问题......不记得为什么
    • 嗯,没有关闭游标可能是因为他们所做的一切都被他们积极推广的 startManagingCursor 覆盖。在 onDestroy 中关闭数据库失败肯定是草率,但我不知道它有多危险。
    【解决方案2】:

    您应该始终关闭您的数据库连接。

    【讨论】:

    • 我只是想,如果每次用户在自动完成文本视图中键入新字符时重新打开数据库是否有意义。也许还有其他解决方案?!
    • 嗯,打开一个数据库连接是相当昂贵的,所以它取决于应用程序的上下文。最理想的选择是尽可能晚地打开与数据库的连接,使其保持打开状态,直到调用最后一个查询,然后最后关闭它。
    • 在我的情况下,这将是用户准备好输入并单击建议列表或按钮中的条目的时间。但是 cursoradapter 应该如何注意到这一点。我没有看到任何销毁或关闭 cursoradapter 的方法......但我现在有了一个想法。我实现了自定义光标适配器,所以我可以编写一个关闭方法......谢谢:)
    • ... 或者我只是在 finalize-method 中关闭 DB-Connection?!嗯 .. 这也是个好主意 .. 还是不行?
    【解决方案3】:

    不要考虑使用finalize() 关闭数据库连接。无法保证它何时会被调用,或者即使会被调用。更多详情请参阅《Effective Java》第二版第 7 条。

    您可以使用onPause()onResume() 来关闭/打开连接吗?我相信 android 提供了一些保证这些被调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-10
      • 2011-07-03
      • 2011-03-27
      • 2010-12-29
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多