2016-04-13 11 views
3
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) 
+0

Sorununuzu çözecek yerel bir veritabanı nesnesi kullanın –

+0

Önemeden düşürmediğim ilk şey, ancak reddetmenin olası nedeni, yalnızca kodunuzu yayınlamanız ve çalıştığınız şeyle ilgili herhangi bir şeyi açıklamamış olmanızdır elde etmek için ve ne gibi ilerleme kaydettiniz vs –

+0

@VivekMishra büyük olasılıkla bu downvote ve sorunu çözmek için oldukça açıklayıcı olarak istisnai neden –

cevap

1

kapatıldıktan sonra bir imleç erişmeye çalışıldı bu kaldırın:

protected SQLiteDatabase database; 

ve yerel

Temelde 2 yöntem eş zamanlı yürütme yapmak ve bir yöntem database.close() ve 2. yöntemi denir

: hala Exception

kullanım bu yüzden veri erişen

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; 
} 

}

+0

dbhelper birçok kez sadece bir kez yapmak ve yeniden kullanmak ve sadece veritabanı yerel –

+0

tutmak ve ayrıca cursor.close() çağırmak değil de imleci –

+0

lütfen tamamlayın her zaman cursor.close() çağırmalısınız benim düzenlenmiş cevabım –

0

el kazanılmış okunabilir/yazılabilir veritabanını kapatın olmamalıdır. Kapattığınızda dbHelper tarafından kapatılacak ve bu istisnalara neden olabilecek diğer açık/kapalı işlemlerle senkronizasyonu yönetecektir.

+0

lütfen değişiklikleri gönderin ... – Sun

+0

Yöntemlerinize eşzamansız olarak çağrı yapıyorsanız, tüm 'database.close()' satırlarını kaldırın. GetReadable/WritableDatabase() ', her zaman aynı örneği döndürdüğünden (eğer kapatmamışsanız),' getXDatabase() 'işlevini 2 yerden çağırırsanız ve bunlardan birini kapatırsanız, diğer yerde kapatırsınız. ve imleçleriniz geçersiz sayılacaktır. Durumunuzdan emin değil. – joseca