title: Cursor window allocation of 2048 kb failed. # Open Cursors=1 (# cursors opened by this proc=1)
body: <p>I'm making an Kiosk app that use database. The app is running all time in foreground. The app have many threads that using one shared DataBaseHelper instance. the app works flawlessly but most of the time after 5 or 6 hour, I encounter these exceptions then app crashes:</p>
  
  <blockquote>
    <p>E/DataBaseHelper﹕ Cursor window allocation of 2048 kb failed. # Open
    Cursors=1 (# cursors opened by this proc=1)</p>
    
    <p>E/CursorWindow﹕ Could not allocate CursorWindow
    '/data/user/0/com.kios.frm/databases/YadProjectDB.db' of
    size 2097152 due to error -24.</p>
    
    <p>E/SQLiteLog﹕ (14) cannot open file at line 30192 of [00bb9c9ce4]</p>
    
    <p>E/SQLiteLog﹕ (14) statement aborts at 16: [SELECT number FROM sms
    LIMIT 5] unable to open database file</p>
    
    <p>E/SQLiteQuery﹕ exception: unable to open database file (code 14);<br>
    query: SELECT number FROM sms LIMIT 5</p>
    
    <p>E/SQLiteLog﹕ (14) os_unix.c:30192: (24)<br>
    open(/data/user/0/com.kiosk.frm/databases/YadProjectDB.db-journal)-</p>
  </blockquote>
  
  <p>I closed cursor properly but still getting those exceptions. what are those exceptions? what is the cause of those exceptions?  </p>
  
  <p><strong>MainActivity</strong></p>
  
  <pre><code>private DataBaseHelper db = null; // Global     
  </code></pre>
  
  <p><strong>MainActivity onCreate method:</strong> </p>
  
  <pre><code>db = new DataBaseHelper(this);
  
  new Thread(new Runnable() {
  @Override
  public void run() {
      while (threadRunningFlag) {
  
      Cursor result = null;
      try {
  
          result = db.getData("SELECT " + DataBaseHelper.SMS_COLUMN_PHONE_NUMBER  + " FROM " + DataBaseHelper.SMS_TABLE_NAME + " LIMIT 5");
          if (result != null &amp;&amp; result.getCount() &gt; 0) {
              while (!result.isAfterLast()) {
                  String phoneNumber = result.getString(result.getColumnIndex(DataBaseHelper.SMS_COLUMN_PHONE_NUMBER));
                  // ...
                  result.moveToNext();
              }
          }
      }catch (Exception e) {
          Log.e(TAG, "err-&gt;" + e.getLocalizedMessage());
  
      }finally {
          if (result != null) {
              result.close();
              result = null;
          }
      }
  
          try {
              Thread.sleep(1000);
          } catch (InterruptedException e) {
              Log.e(TAG, e.getMessage());
          }
      }
  }
  }).start();
  </code></pre>
  
  <p><strong>DataBaseHelper class:</strong></p>
  
  <pre><code>public class DataBaseHelper extends SQLiteOpenHelper {
  
      private static final int DATABASE_VERSION = 1;
      public static final String DATABASE_NAME = "YadProjectDB.db";
      public static final String SMS_TABLE_NAME = "sms";
      public static final String SMS_COLUMN_PHONE_NUMBER = "number";
      public static final String SMS_COLUMN_SMS_TEXT = "message";
  
      public static final String BLACK_LIST_TABLE_NAME = "blackList";
      public static final String BLACK_LIST_COLUMN_ID = "id";
      public static final String BLACK_LIST_COLUMN_PHONE_NUMBER = "number";
  
      private final String TAG = "DataBaseHelper";
  
      public DataBaseHelper(Context context) {
          super(context, DATABASE_NAME, null, DATABASE_VERSION);
  
      }
  
      @Override
      public void onCreate( SQLiteDatabase db ) {
          String command = "CREATE TABLE "
                  + SMS_TABLE_NAME
                  + "("
                  + SMS_COLUMN_PHONE_NUMBER + " TEXT,"
                  + SMS_COLUMN_SMS_TEXT + " TEXT,"
                  + ")";
          try {
              db.execSQL(command);
          }catch (Exception e) {
              Log.e(TAG, "err-&gt;" + e.getMessage());
          }
  
          command = "CREATE TABLE "
                  + BLACK_LIST_TABLE_NAME
                  + "("
                  + BLACK_LIST_COLUMN_PHONE_NUMBER + " TEXT,"
                  + ")";
          try {
              db.execSQL(command);
          }catch (Exception e) {
              Log.e(TAG, "err-&gt;" +  e.getMessage());
          }
      }
  
      public boolean insertToSms(String number, String message, String fileName, Integer uploadFlag, Integer blackList, Integer pictureFlag)
      {
          final SQLiteDatabase db = this.getWritableDatabase();
          ContentValues contentValues = new ContentValues();
          contentValues.put(SMS_COLUMN_PHONE_NUMBER, number);
          contentValues.put(SMS_COLUMN_SMS_TEXT, message);
          try {
              db.insert(SMS_TABLE_NAME, null, contentValues);
              return true;
          }catch (Exception e) {
              Log.e(TAG, "err-&gt;" + e.getMessage());
              return false;
          }
      }
  
      public Cursor getData(String query){
          final SQLiteDatabase db = getReadableDatabase();
          Cursor res = null;
          try {
              res = db.rawQuery(query, null);
              res.moveToFirst();
              return res;
          }catch (Exception e) {
              Log.e(TAG, "err-&gt;" + e.getMessage());
              if (res != null) {
                  res.close();
                  res = null;
              }
          }
          return null;
      }
  }
  </code></pre>