【问题标题】:A SQLiteConnection object for database was leaked! Please fix your application数据库的 SQLiteConnection 对象被泄露!请修复您的应用程序
【发布时间】: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

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

【问题讨论】:

标签: java android database sqlite


【解决方案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】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-20
          • 1970-01-01
          • 1970-01-01
          • 2017-02-05
          • 2020-05-03
          • 1970-01-01
          • 2020-06-13
          相关资源
          最近更新 更多