title: Error, bur can't close cursor / database
body: <p>I keep getting the error "DatabaseObjectNotClosedException: <strong>Application did not close the cursor or database object that was opened here</strong>", but I can't find the cursor / database that is't closed.</p>
  
  <p><strong>Can anybody please tell me where I forgot to close something?</strong></p>
  
  <p>I'm working with a custom adapter:</p>
  
  <p>OnCreate of <strong>MainActivity</strong>:</p>
  
  <pre><code>@Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_my);
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  
      gridview = (GridView) findViewById(R.id.gridview);
  
      db = new DatabaseHelper(this);
      db.open();
      mCursor = db.getAllRecords();
  
      MyCursorAdapter mAdapter = new MyCursorAdapter(MyActivity.this, mCursor, false);
      mAdapter.notifyDataSetChanged();
  
      gridview.setAdapter(mAdapter);
      mCursor.close();
      db.close();
  }
  </code></pre>
  
  <p><strong>MyCursorAdapter.java</strong></p>
  
  <pre><code>import android.app.ProgressDialog;
  import android.content.ContentResolver;
  import android.content.Context;
  import android.database.Cursor;
  import android.graphics.Bitmap;
  import android.graphics.BitmapFactory;
  import android.os.AsyncTask;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.CursorAdapter;
  import android.widget.ImageView;
  import android.widget.TextView;
  
  import java.io.FileInputStream;
  import java.io.FileNotFoundException;
  import java.io.IOException;
  
  public class MyCursorAdapter extends CursorAdapter {
  
  private final LayoutInflater mInflater;
  private ContentResolver mContent;
  
  public Context cContext ;
  
  public MyCursorAdapter(Context context, Cursor c, boolean autoRequery) {
      super(context, c, autoRequery);
      mInflater = LayoutInflater.from(context);
      mContent = context.getContentResolver();
  }
  
  
  ImageView iv;
  
  @Override
  public View newView(Context context, Cursor cursor, ViewGroup parent) {
      return mInflater.inflate(R.layout.list_item, parent, false);
  }
  
  @Override
  public void bindView(View view, Context context, Cursor cursor) {
      String path = cursor.getString(cursor.getColumnIndex("path"));
      iv = (ImageView) view.findViewById(R.id.imageView);
      new loadImage().execute(path);
  
      String userName = cursor.getString(cursor.getColumnIndex("title"));
      TextView userNameTV = (TextView) view.findViewById(R.id.textView);
      userNameTV.setText(userName);
  
      cursor.close();
  }
  
  private class loadImage extends AsyncTask&lt;String, Integer, Bitmap&gt; {
  
      ProgressDialog dialog;
  
      @Override
      protected void onPreExecute() {
          // example of setting up something
          dialog = new ProgressDialog(cContext);
          dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
          dialog.setMax(100);
          dialog.show();
      }
  
      @Override
      protected Bitmap doInBackground(String... strings) {
  
          for (int i = 0; i &lt; 20; i++) {
              publishProgress(5);
              try {
                  Thread.sleep(88);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
          dialog.dismiss();
  
          FileInputStream fin;
  
          try {
              fin = cContext.openFileInput(strings[0]);
              if(fin !=null &amp;&amp; fin.available() &gt; 0) {
                  return BitmapFactory.decodeStream(fin);
              }
          } catch (FileNotFoundException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
  
          return null;
      }
  
      @Override
      protected void onPostExecute(Bitmap bitmap) {
          iv.setImageBitmap(bitmap);
      }
  
      @Override
      protected void onProgressUpdate(Integer... progress) {
          dialog.incrementProgressBy(progress[0]);
      }
  }
  }
  </code></pre>
  
  <p>To be sure, I added a my closestatements in the OnPause and OnDestroy of my MainActivity, like this:</p>
  
  <pre><code>@Override
  protected void onDestroy() {
      if (mCursor != null) {
          mCursor.close();
      }
      if (db != null) {
          db.close();
      }
  }
  
  @Override
  protected void onPause() {
      if (mCursor != null) {
          mCursor.close();
      }
      if (db != null) {
          db.close();
      }
  }
  </code></pre>
  
  <p><strong>The whole error</strong>:</p>
  
  <pre><code>06-27 16:29:52.238      879-888/com.android.email E/StrictMode﹕ Finalizing a Cursor that     has not been deactivated or closed. database =     /data/data/com.android.email/databases/EmailProvider.db, table = null, query = SELECT _id     AS _id,'SW5ib3g' AS persistentId,
  'content://com.android.email.provider/uifolder/' || _id AS folderUri,displayName AS   name,flags&amp;1 AS hasChildren,'16424' AS capabilities,3 AS syncWindow,'content://com.android.email.provider/uimessages/' || _id AS         conversationListUri,
  'content://com.android.email.provider/uisubfolders/' || _id AS childFoldersListUri,NULL     AS     unseenCount,unreadCount AS unreadCount,CASE WHEN totalCount&lt;0 OR type=3 OR type=4 OR      type=6     THEN messageCount ELSE totalCount END AS totalCount,
  'content://com.android.email.provider/uirefresh/' || _id AS refreshUri,uiSyncStatus AS  syncStatus,uiLastSyncResult AS lastSyncResult,CASE type WHEN 0 THEN 2 WHEN 3 THEN 4 WHEN 4  THEN 8 WHEN 5 THEN 16 WHEN 6 THEN 32 WHEN 7 THEN 64 WHEN 9 THEN 128 WHEN 10 THEN 
  2048 WHEN 8 THEN 4097 ELSE 1 END AS type,CASE type WHEN 0 THEN 2130837570 WHEN 3 THEN 2130837566 WHEN 4 THEN 2130837574 WHEN 5 THEN 2130837578 WHEN 6 THEN 2130837586 WHEN 9 THEN   2130837582 ELSE -1 END AS iconResId,NULL AS notific
  
  android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
          at android.database.sqlite.SQLiteCursor.&lt;init&gt;(SQLiteCursor.java:98)
          at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:50)
          at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
          at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
          at com.android.email.provider.EmailProvider.uiQuery(EmailProvider.java:4302)
          at com.android.email.provider.EmailProvider.query(EmailProvider.java:1212)
          at android.content.ContentProvider.query(ContentProvider.java:857)
          at android.content.ContentProvider$Transport.query(ContentProvider.java:200)
          at android.content.ContentResolver.query(ContentResolver.java:461)
          at android.content.ContentResolver.query(ContentResolver.java:404)
          at com.android.email.NotificationController.refreshNotificationsForAccountInternal(NotificationController.java:635)
          at com.android.email.NotificationController.refreshNotificationsForAccount(NotificationController.java:588)
          at com.android.email.NotificationController.access$1200(NotificationController.java:65)
          at com.android.email.NotificationController$MessageContentObserver.onChange(NotificationController.java:705)
          at android.database.ContentObserver.onChange(ContentObserver.java:129)
          at android.database.ContentObserver$NotificationRunnable.run(ContentObserver.java:180)
          at android.os.Handler.handleCallback(Handler.java:733)
          at android.os.Handler.dispatchMessage(Handler.java:95)
          at android.os.Looper.loop(Looper.java:136)
          at com.android.email.NotificationController$NotificationThread.run(NotificationController.java:792)
          at java.lang.Thread.run(Thread.java:841)
  </code></pre>