StaleDataException: Attempted to access a cursor after it has been closed

匿名 (未验证) 提交于 2019-12-03 03:03:02

问题:

FATAL EXCEPTION: main Process: com.example.lenovo.phone, PID: 4885 android.database.StaleDataException: Attempted to access a cursor after it has been closed. at android.database.BulkCursorToCursorAdaptor.throwIfCursorIsClosed(BulkCursorToCursorAdaptor.java:64) at android.database.BulkCursorToCursorAdaptor.requery(BulkCursorToCursorAdaptor.java:133) at android.database.CursorWrapper.requery(CursorWrapper.java:186) at android.app.Activity.performRestart(Activity.java:5309) at android.app.ActivityThread.handleSleeping(ActivityThread.java:3514) at android.app.ActivityThread.access$2900(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1500) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:5299) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515)                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645) at dalvik.system.NativeStart.main(Native Method) 

回答1:

Remove this:

protected SQLiteDatabase database; 

and make it local

Basically 2 method are executing concurrently and one method called database.close() and 2nd method is still accessing data so the Exception

use this:

public class db {  DataBaseHelper dbHelper; Context mContext;   public db(Context context) {     this.mContext = context; }  public db open() throws SQLException {     dbHelper = new DataBaseHelper(mContext);     return this; }   public void close() {     dbHelper.close(); }  public void insertdb( int id,String ph_num, String call_type, String calldate, String call_duration, String upload_status) {     SQLiteDatabase database = dbHelper.getWritableDatabase();     ContentValues values = new ContentValues();     values.put(DataBaseHelper.id,id);     values.put(DataBaseHelper.phone_number, ph_num);     values.put(DataBaseHelper.call_type, call_type);     values.put(DataBaseHelper.call_date, calldate);     values.put(DataBaseHelper.call_duration, call_duration);     values.put(DataBaseHelper.upload_status, upload_status);     database.insert(DataBaseHelper.table_name, null, values);     database.close();     // Log.d("Database helper", "values inserted"); }   public ArrayList<HashMap<String, String>> getAllUsers() {     ArrayList<HashMap<String, String>> wordList;     wordList = new ArrayList<HashMap<String, String>>();     String selectQuery = "SELECT  * FROM call_logtable";     SQLiteDatabase database = dbHelper.getWritableDatabase();     Cursor cursor = database.rawQuery(selectQuery, null);     if (cursor.moveToFirst()) {         do {             HashMap<String, String> map = new HashMap<String, String>();             map.put("id", cursor.getString(0));             map.put("phone_number", cursor.getString(1));             map.put("call_type", cursor.getString(2));             map.put("call_date", cursor.getString(3));             map.put("call_duration", cursor.getString(4));             wordList.add(map);         } while (cursor.moveToNext());     }     cursor.close(); // just added     database.close();     return wordList; }  /**  * Compose JSON out of SQLite records  * @return  */ public String composeJSONfromSQLite(){     ArrayList<HashMap<String, String>> wordList;     wordList = new ArrayList<HashMap<String, String>>();     String selectQuery = "SELECT  * FROM call_logtable where upload_status = '"+"no"+"'";     SQLiteDatabase database = dbHelper.getWritableDatabase();     Cursor cursor = database.rawQuery(selectQuery, null);     if (cursor.moveToFirst()) {         do {             HashMap<String, String> map = new HashMap<String, String>();             map.put("id", cursor.getString(0));             map.put("phone_number", cursor.getString(1));             map.put("call_type", cursor.getString(2));             map.put("call_date", cursor.getString(3));             map.put("call_duration", cursor.getString(4));             wordList.add(map);         } while (cursor.moveToNext());     }     cursor.close(); // just added     database.close();     Gson gson = new GsonBuilder().create();     //Use GSON to serialize Array List to JSON     return gson.toJson(wordList); }   public int dbSyncCount(){     int count = 0;     String selectQuery = "SELECT  * FROM call_logtable where upload_status = '"+"no"+"'";     SQLiteDatabase database = dbHelper.getWritableDatabase();     Cursor cursor = database.rawQuery(selectQuery, null);     count = cursor.getCount();     cursor.close(); // just added     database.close();     return count; }   public void updateSyncStatus(String id, String status){     SQLiteDatabase database = dbHelper.getWritableDatabase();     String updateQuery = "Update call_logtable set upload_status = '"+ status +"' where id="+"'"+ id +"'";     Log.d("query", updateQuery);     database.execSQL(updateQuery);     database.close(); }  public Cursor getinformation() {     SQLiteDatabase database = dbHelper.getReadableDatabase();     String[] columns={DataBaseHelper.phone_number,DataBaseHelper.call_type,DataBaseHelper.call_date,DataBaseHelper.call_duration,DataBaseHelper.upload_status};     return database.query(DataBaseHelper.table_name,columns,null,null,null,null,null); }  public void delete() {     SQLiteDatabase database = dbHelper.getWritableDatabase();     // String[] columns={DataBaseHelper.phone_number,DataBaseHelper.call_type,DataBaseHelper.call_date,DataBaseHelper.call_duration};     database.delete(DataBaseHelper.table_name, null, null); }   StringBuffer readSpecificfrom_db(String type) {     String ph_number=null;     String call_type=null;     String call_date=null;     String call_duration=null;     String upload_status=null;     StringBuffer sb = new StringBuffer();     //sb.append("Call Log :");     Cursor cursor_object=getinformation();     cursor_object.moveToFirst();     do {         if((cursor_object.getString(1)).equals(type)) {             ph_number = cursor_object.getString(0);             call_type = cursor_object.getString(1);             call_date = cursor_object.getString(2);             call_duration = cursor_object.getString(3);             if(type=="Missed") {                 sb.append("\nPhone Number:--- " + ph_number +                                 " \nCall Type:--- " + call_type +                                 " \nCall Date:--- " + call_date                         //   + " \nCall duration in sec :--- " + call_duration                 );                 sb.append("\n----------------------------------");             }             else             {                 sb.append("\nPhone Number:--- " + ph_number +                         " \nCall Type:--- " + call_type +                         " \nCall Date:--- " + call_date                         + " \nCall duration in sec :--- " + call_duration);                 sb.append("\n----------------------------------");             }         }     }while(cursor_object.moveToNext());     cursor_object.close(); // just added     return sb;  }  StringBuffer readfrom_db() {     String ph_number=null;     String call_type=null;     String call_date=null;     String call_duration=null;     String upload_status;     //  int id=0;     StringBuffer sb = new StringBuffer();     // sb.append("Call Log :");     Cursor cursor_object=getinformation();     cursor_object.moveToFirst();     do {         ph_number=cursor_object.getString(0);         call_type=cursor_object.getString(1);         call_date=cursor_object.getString(2);         call_duration=cursor_object.getString(3);         sb.append("\nPhone Number:--- " + ph_number +                 " \nCall Type:--- " + call_type +                 " \nCall Date:--- " + call_date                 + " \nCall duration in sec :--- " + call_duration);         sb.append("\n----------------------------------");      } while(cursor_object.moveToNext());     cursor_object.close(); // just added     return sb; } 

}



回答2:

You should not close the gotten readable/writable database manually. It will be closed by the your dbHelper when you close it and will manage the synchronization with other open/close operations that could cause those exceptions.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!