54

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 SQLite Connection leaked although everything closed

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

Community
  • 1
  • 1
user3906040
  • 631
  • 1
  • 8
  • 12

6 Answers6

32

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()
Daniel F
  • 12,968
  • 10
  • 84
  • 107
Devrath
  • 39,949
  • 51
  • 178
  • 266
  • Could you please help to solve this [issue](https://stackoverflow.com/questions/62646206/unable-to-prevent-sqliteconnection-object-leakage) – MrinmoyMk Jun 29 '20 at 22:29
9

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

G. Blake Meike
  • 6,482
  • 3
  • 22
  • 39
6
//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();
}
Ave Maria
  • 71
  • 1
  • 3
  • 1
    Thank you for taking the time to leave an answer. Unfortunately, it is missing a description and explanation of what you have provided. Please update your question to include this – I.T Delinquent Jul 18 '19 at 14:43
1

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);
      }
    }
Basheer Adel
  • 11
  • 1
  • 2
0

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.

IgniteCoders
  • 4,126
  • 3
  • 40
  • 58
0

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

Sample Screenshot

Kamran Ahmed
  • 7,511
  • 3
  • 28
  • 52