数据库的 SQLiteConnection 对象被泄露!请修复您的应用程序

Posted

技术标签:

【中文标题】数据库的 SQLiteConnection 对象被泄露!请修复您的应用程序【英文标题】:A SQLiteConnection object for database was leaked! Please fix your application 【发布时间】:2014-10-08 02:15:35 【问题描述】:

我的应用程序给了我这个警告

数据库的 SQLiteConnection 对象 '+data+data+com_example_test+database' 被泄露了!请修复 您的申请以正确结束正在进行的交易并关闭 不再需要的数据库。

但每次使用后我都会关闭 db 对象和光标。

        try 
            while (cursor.moveToNext()) 
              ...
            
         finally 
            if (cursor != null && !cursor.isClosed())
                cursor.close();
        

...
    db.close();

你能帮我理解问题所在吗? 谢谢!!!

更新! 我从这篇文章中尝试了这个解决方案 SQLite Connection leaked although everything closed

而且我没有内存泄漏了,这是一个好的解决方案吗?

【问题讨论】:

有些地方不会发生这种情况。 似乎问题出在写入数据库中,您有未提交的事务吗? SQLite Connection leaked although everything closed的可能重复 【参考方案1】:

可能的解决方案

你有not committed the transactions你已经开始(你应该 一旦开始,请务必关闭交易) 检查是否关闭了已打开的游标 使用Sqlite(看起来你已经从你发布的代码中完成了这一步) 还将db.close 移动到finally 块 在使用context.deleteDatabase(...) 删除数据库然后使用dbHelper.getWritableDatabase() 重新创建数据库之前,您尚未在数据库上调用db.close

【讨论】:

请您帮忙解决这个问题issue【参考方案2】:

只需将 db.close 拖到 finally 块中即可。

【讨论】:

【参考方案3】:
//Inside your SQLite helper class
@Override
public synchronized void close () 
    if (db != null) 
        db.close();
        super.close();
    


//Inside the activity that makes a connection to the helper class
@Override
protected void onDestroy () 
    super.onDestroy();
    //call close() of the helper class
    dbHelper.close();

【讨论】:

感谢您抽出宝贵时间留下答案。不幸的是,它缺少对您提供的内容的描述和解释。请更新您的问题以包含此【参考方案4】:

在我的情况下,当您尝试下载新数据并且应该更新数据库时导致错误。

我通过调用SELECT 0 解决了实例化数据库的问题。这会导致数据库被更新,所以之后我尝试下载新数据。并且工作正常。

【讨论】:

【参考方案5】:

此代码停止泄漏并修复光标问题。

 public class DatabaseHelper extends SQLiteOpenHelper  
    
      private static DatabaseHelper sInstance;
    
      private static final String DATABASE_NAME = "database_name";
      private static final String DATABASE_TABLE = "table_name";
      private static final int DATABASE_VERSION = 1;
    
      public static DatabaseHelper getInstance(Context context) 
    
        // Use the application context, which will ensure that you 
        // don't accidentally leak an Activity's context.
        if (sInstance == null) 
          sInstance = new DatabaseHelper(context.getApplicationContext());
        
        return sInstance;
      
    
      /**
       * Constructor should be private to prevent direct instantiation.
       * make call to static factory method "getInstance()" instead.
       */
      private DatabaseHelper(Context context) 
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
      
    

【讨论】:

【参考方案6】:

可能你忘了去掉调试的断点 示例:

【讨论】:

以上是关于数据库的 SQLiteConnection 对象被泄露!请修复您的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 sqlite-net orm 的 SQLiteConnection.Delete(object) 命令后更改 sqlite 文件大小

“SQLite.SQLiteConnection”的类型初始化器抛出异常

数据库内存泄漏——A SQLiteConnection object for database '/data/data/.../databases/....db' was leaked

网络共享路径上的 sqliteconnection(通用 Windows 平台)

Windows Mobile 6.1 + SQLite:无法加载类型“System.Data.SQLite.SQLiteConnection”

在 playstore (SQLiteConnection.java) 上启动后,我的 Flutter 应用程序在多个设备上崩溃