【问题标题】:How to close a database used within a ContentProvider in Android如何关闭 Android 中 ContentProvider 中使用的数据库
【发布时间】:2013-03-17 17:47:51
【问题描述】:

我正在使用 CursorLoader 和 ContentProvider 将数据库的内容加载到 GridView 中。

应用程序正在运行,但在日志中多次写入“close() 从未在数据库上显式调用。

我发现了一些关于这个问题的主题,对“在 ContentProvider 中关闭数据库是”的响应:“内容提供者是在创建其托管进程时创建的,并且只要进程存在就一直存在,所以没有需要关闭数据库”。

那么,怎么了? 由于数据库是在 ContentProvider 中打开的,如果我关闭它,返回的光标将为空,我该如何解决这个问题?

【问题讨论】:

  • 确保您在ContentProvider.onCreate 方法中打开数据库,而不是在其他地方(例如在insert 或查询中)
  • 不需要关闭数据库,见this thread
  • @vmironov documentation 给出了确切的建议:不应该在onCreate() 中调用可能很慢的操作。

标签: android database android-cursorloader


【解决方案1】:

当数据库在关闭之前被垃圾收集时,会打印该消息。这里有很多关于这个问题的讨论:

Closing the database in a ContentProvider

tl;dr:别担心。一般来说,关闭数据库实际上会适得其反。关闭您的事务和光标,让 android 管理数据库。

顺便说一句,请注意在 onCreate 中打开数据库。如果您使用 SQLiteDatabaseHelper 打开数据库,则可能会调用 onUpdate 方法。在更新数据库的过程中,没有什么比让您的程序被 ANR 杀死更糟糕的了。

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多