SQLite connection object leaked - Android

android, java, memory-leaks, sqlite, sqliteopenhelper

Solution

All I did was implement this answer to a similar question and now it doesn't show the SQL connection object leak error. I cannot recommend this enough. It only took a few minutes to implement and worked.

Here is the code:

public class DatabaseHelper extends SQLiteOpenHelper { 

  private static DatabaseHelper mInstance = null;

  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 ctx) {

    // Use the application context, which will ensure that you 
    // don't accidentally leak an Activity's context.
    // See this article for more information: http://bit.ly/6LRzfx
    if (mInstance == null) {
      mInstance = new DatabaseHelper(ctx.getApplicationContext());
    }
    return mInstance;
  }

  /**
   * Constructor should be private to prevent direct instantiation.
   * make call to static factory method "getInstance()" instead.
   */
  private DatabaseHelper(Context ctx) {
    super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
  }
}

Problem

I am making my first android app, and I took some sqlite tutorials first, that taught me to use a databaseHelper that extends SQLiteOpenHelper. So my databaseHelper does extend SQLiteOpenHelper. I get a sqlite connection leak warning in the Logcat so would like some advice about what to do to fix that. I get this error: ``` 02-01 21:39:50.740: W/SQLiteConnectionPool(32061): A SQLiteConnection object for database '/data/data/com.btf271.fashionassistant/databases/clothingManager' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed. ``` My databaseHelper functions that are called where the leak occurs: ``` public List<Sticker> getObjectsByGenderAndCategory(String gender, String category) { List<Sticker> objects = new ArrayList<Object>(); String selectQuery = String.format( "SELECT * FROM %s WHERE %s = \"%s\" AND %s = \"%s\"", TABLE_OBJECT, KEY_GENDER, gender, KEY_CATEGORY, category); Log.e(LOG, selectQuery); SQLiteDatabase db = this.getReadableDatabase(); Cursor c = db.rawQuery(selectQuery, null); try{ // looping through all rows and adding to list if (c.moveToFirst()) { do { Object o = createClothingItemJavaObject(c); // adding to object list objects.add(o); } while (c.moveToNext()); } }finally { c.close(); db.close(); } return objects; } ``` I found this which I will try tomorrow. It's late. Thanks.

Original source

Related problems