A SQLiteConnection object for database was leaked! Please fix your application

JavaAndroidDatabaseSqlite

Java Problem Overview


My application give me this warning

> A SQLiteConnection object for database > '+data+data+com_example_test+database' was leaked! Please fix > your application to end transactions in progress properly and to close > the database when it is no longer needed.

But I close the db object and the cursor after every use.

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

...
    db.close();

Can you help me for understand what is the problem? thanks!!!

UPDATE! I try this solution from this post https://stackoverflow.com/questions/18147354/sqlite-connection-leaked-although-everything-closed/18148718#18148718

and I don't have memory leak anymore, is it a good solution?

Java Solutions


Solution 1 - Java

Possible Solutions:

  • You have not committed the transactions you have started (You should always close the transaction once you started)
  • Check whether you have closed the cursors you have opened if you are using Sqlite (Looks like you have done this step from the code you posted)
  • Also move the db.close to finally block
  • You have not called db.close on a database before deleting it with context.deleteDatabase(...) and then recreating it with dbHelper.getWritableDatabase()

Solution 2 - Java

Just drag that db.close up into the finally block.

Solution 3 - Java

//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();
}

Solution 4 - Java

In my case the error was caused when y try to download new data and database should be updated.

I solved it instantiating the database by calling a SELECT 0. That cause database to be updated, so after that I try to download the new data. And worked fine.

Solution 5 - Java

Probably you forgot to remove the break point of debugging sample:

Sample Screenshot

Solution 6 - Java

this code stops the leak and fixes cursor problems.

 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);
      }
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser3906040View Question on Stackoverflow
Solution 1 - JavaDevrathView Answer on Stackoverflow
Solution 2 - JavaG. Blake MeikeView Answer on Stackoverflow
Solution 3 - JavaAve MariaView Answer on Stackoverflow
Solution 4 - JavaIgniteCodersView Answer on Stackoverflow
Solution 5 - Javasteve RogersView Answer on Stackoverflow
Solution 6 - JavaBasheer AdelView Answer on Stackoverflow