E/DataBaseHelper﹕ Cursor window allocation of 2048 kb Failed. # Open
Cursors=1 (# cursors opened by this proc=1)E/CursorWindow﹕ Could not allocate CursorWindow
‘/data/user/0/com.kios.frm/databases/YadProjectDB.db’ of
size 2097152 due to error -24.E/sqliteLog﹕ (14) cannot open file at line 30192 of [00bb9c9ce4]
E/sqliteLog﹕ (14) statement aborts at 16: [SELECT number FROM sms
LIMIT 5] unable to open database fileE/sqliteQuery﹕ exception: unable to open database file (code 14);
query: SELECT number FROM sms LIMIT 5E/sqliteLog﹕ (14) os_unix.c:30192: (24)
open(/data/user/0/com.kiosk.frm/databases/YadProjectDB.db-journal)-
我正确关闭了光标,但仍然获得了这些异常.那些例外是什么?这些例外的原因是什么?
主要活动
private DataBaseHelper db = null; // Global
MainActivity onCreate方法:
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类:
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,"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,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; } }
解决方法
你的错误说:“打开游标”
上述问题的答案解释了:
Most often the cause for this error are non closed cursors. Make sure
you close all cursors after using them (even in the case of an error).
Cursor cursor = null; try { cursor = db.query(... // do some work with the cursor here. } finally { // this gets called even if there is an exception somewhere above if(cursor != null) cursor.close(); }