title: Android- java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed
body: <p>I was reading through stackoverflow about this question and I still haven't found a solution. Sometimes my application face this problem. this is my error log,</p>
  
  <pre><code>12-31 10:58:28.025: E/AndroidRuntime(16322): FATAL EXCEPTION: Timer-0
  12-31 10:58:28.025: E/AndroidRuntime(16322): java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:1031)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:746)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:400)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:905)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:834)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:144)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at com.eyepax.horseapp.data.dbadapters.ContactGroupDbAdapter.getContactGroups(ContactGroupDbAdapter.java:138)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at com.eyepax.horseapp.data.DataManager.getGroups(DataManager.java:1548)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at com.eyepax.horseapp.sync.ContactSync.contactGroupSync(ContactSync.java:43)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at com.eyepax.horseapp.service.SynchingService.callSync(SynchingService.java:77)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at com.eyepax.horseapp.service.SynchingService.access$0(SynchingService.java:70)
  12-31 10:58:28.025: E/AndroidRuntime(16322):    at com.eyepax.horseapp.service.SynchingService$1.run(SynchingService.java:57)
  </code></pre>
  
  <p>This is the method which crashed in ContacGroupDbAdapter class,</p>
  
  <pre><code>/**
   * Returns ContactGroup.
   * 
   * @return ArrayList&lt;ContactGroup&gt;
   */
  public ArrayList&lt;ContactGroup&gt; getContactGroups() {
  
      this.open();
      Cursor cursor = database.rawQuery("SELECT * FROM " + TABLE_NAME, null);
      ArrayList&lt;ContactGroup&gt; list = null;
  
      if (cursor != null &amp;&amp; cursor.moveToFirst()) {
          list = new ArrayList&lt;ContactGroup&gt;();
  
          do {
              try {
                  ContactGroup contactGroup = new ContactGroup();
                  contactGroup.setGroupId(cursor.getString(cursor.getColumnIndex(GROUP_ID)));
                  contactGroup.setGroupName(cursor.getString(cursor.getColumnIndex(GROUP_NAME)));
                  contactGroup.setIsDeleted(cursor.getInt(cursor.getColumnIndex(GROUP_IS_DELETED)));
                  contactGroup.setUpdatedDate(cursor.getString(cursor.getColumnIndex(GROUP_UPDATE_DATE)));
                  contactGroup.setIsSync(cursor.getInt(cursor.getColumnIndex(GROUP_IS_SYNC)));
  
                  list.add(contactGroup);
              } catch (Exception e) {
  
              }
          } while (cursor.moveToNext());
  
      }
  
      if (cursor != null)
          cursor.close();
      return list;
  }
  </code></pre>
  
  <p>And that it crashed in the line cursor.moveToFirst() with this error. please help me to resolve this issue.</p>
  
  <p>i used separate BaseDbAdapter class to close db,</p>
  
  <pre><code>public class BaseDbAdapter {
  
  /**
   * Application context.
   */
  protected Context context;
  
  /**
   * Database.
   */
  protected SQLiteDatabase database;
  
  /**
   * Database helper class.
   */
  protected SQLiteDataBaseHelper dbHelper;
  
  /**
   * StringBuilder
   */
  protected StringBuilder stringBuilder;
  
  public static final String CREATE_TABLE_PRE_TEXT = "create table if not exists ";
  /**
   * Returns StringBuilder object.
   * 
   * @return
   */
  protected StringBuilder getStringBuilder() {
      if (stringBuilder == null) {
          stringBuilder = new StringBuilder();
      }
  
      return stringBuilder;
  }
  
  /**
   * Opens a connection to the database.
   * 
   * @throws SQLException
   */
  public synchronized void open() throws SQLException {
      dbHelper = SQLiteDataBaseHelper.getInstance(context);
      database = dbHelper.getWritableDatabase();
  }
  
  /**
   * Closes the connection.
   */
  public synchronized void close() {
      database.close();
  }
  
  public static String getDeleteTableStatement(String tableName) {
      return "DELETE TABLE " + tableName;
  }
  </code></pre>
  
  <p>}</p>
  
  <p>I used SQLiteDataBaseHelper class and its getInstance method changed as synchronised.<br>
  <a href="https://stackoverflow.com/a/23293930/3800832">as this answer</a> but still issue not fixed.</p>
  
  <pre><code> /**
   * Get an instance of SQLiteDataBaseHelper.
   * 
   * @param context
   * @return SQLiteDataBaseHelper
   */
  public static synchronized SQLiteDataBaseHelper getInstance(Context context) {
  
      // if(dbName == null) {
      // dbName = DataManager.getSQLiteDatabaseName(context);
      // }
  
      if (instance == null) {
          instance = new SQLiteDataBaseHelper(context);
  
      }
  
      return instance;
  }
  </code></pre>