I am making a Kiosk application using a database. The application runs all the time in the foreground. There are many threads in an application that use one common instance of DataBaseHelper. the application works flawlessly, but most of the time after 5 or 6 hours I encounter these exceptions, after which the application crashes:
E / DataBaseHelper: Failed to select cursor window 2048 kb. # Open Cursors = 1 (# cursors opened by this proc = 1)
E / CursorWindow: Failed to allocate CursorWindow '/data/user/0/com.kios.frm/databases/YadProjectDB.db' of size 2097152 due to a -24 error.
E / SQLiteLog: (14) cannot open file on line 30192 of [00bb9c9ce4]
E / SQLiteLog: (14) statement cancels the value 16: [SELECT number FROM sms LIMIT 5] could not open the database file
E / SQLiteQuery: exception: cannot open the database file (code 14); query: SELECT number FROM sms LIMIT 5
E / SQLiteLog: (14) os_unix.c: 30192: (24)
open (/data/user/0/com.kiosk.frm/databases/YadProjectDB.db-journal) -
I closed the cursor correctly, but still get these exceptions. what are these exceptions? what is the reason for these exceptions?
Mainactivity
private DataBaseHelper db = null;
MainActivity onCreate Method:
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 && result.getCount() > 0) { while (!result.isAfterLast()) { String phoneNumber = result.getString(result.getColumnIndex(DataBaseHelper.SMS_COLUMN_PHONE_NUMBER)); // ... result.moveToNext(); } } }catch (Exception e) { Log.e(TAG, "err->" + e.getLocalizedMessage()); }finally { if (result != null) { result.close(); result = null; } } try { Thread.sleep(1000); } catch (InterruptedException e) { Log.e(TAG, e.getMessage()); } } } }).start();
DataBaseHelper Class:
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->" + 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->" + 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->" + 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->" + e.getMessage()); if (res != null) { res.close(); res = null; } } return null; } }