13

我知道這個問題在SO中已經問過很多次了,但我無法弄清楚我確切的問題。嘗試重新打開已關閉的對象:java.lang.IllegalStateException:?

我使用以下代碼從數據庫(表1)中獲取數據並根據檢索值更新另一個Table2。它在一些Android版本中工作正常,但是當我去測試Android 4.0.3時。我將此java.lang.IllegalStateException:?.attempt to re-open an already-closed object設置爲sum_cursor.moveToNext();

我在AsyncTask中使用此代碼。

/** Sum of total matched values*/ 
      Cursor sum_cursor = db.gettotalMatchvalue(this); 
      if(sum_cursor!=null) 
      { 
       sum_cursor.moveToFirst(); 
       for(int j=0; j<sum_cursor.getCount();j++) 
       {  
        float totalmatchedscore = sum_cursor.getInt(0); 
        float totalingredients = Float.parseFloat(sum_cursor.getString(sum_cursor.getColumnIndex(APPDatabase.CK_TOTALINCREDIENTS))); 
        /**average = totalscore/totalingredients*/ 
        double average = totalmatchedscore/totalingredients; 
        int id = Integer.parseInt(sum_cursor.getString(sum_cursor.getColumnIndex(APPDatabase.CK_ID))); 

       db.updateAverage(id, average); 
       sum_cursor.moveToNext(); //Here is the problem 
       } 
      } 
      db.close(); 

我的更新方法編碼

/** Update average */ 
public void updateAverage(int id,double average) 
{ 
    SQLiteDatabase db = getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(CK_FINALVALUE,average); 
    db.update(TABLE, values,CK_ID+" = "+id , null); 
} 

什麼,我做錯了什麼?

我知道你們很多人遇到過這種情況。你能幫助我嗎?

感謝您的幫助。

+0

也許你已經關閉了數據庫在異步任務之外。你檢查過嗎? – 2012-07-24 15:04:23

+0

4.0.3是否比使用其他系統的系統運行得更快,如果是的話,您可能會發生一些競爭情況。 – 2012-07-24 15:07:26

+0

不,我認爲那很好.. – GoCrazy 2012-07-24 15:07:58

回答

23

迭代查詢結果時無法更新表。這有很好的理由;如果您添加的數據會導致您正在迭代的數據發生變化,該怎麼辦?你的光標不會返回有效的數據。

試圖將數據存儲回updateAverage()中的表中導致該問題。您應該記住循環過程中的平均值,然後在完成循環遊標後更新一次。

爲了進一步解釋你得到確切的錯誤:插入新的數據的行爲是導致數據庫關閉所有當前打開的遊標,作爲安全措施。所以當您在更新平均值後致電sum_cursor.moveToNext()時,光標有點驚訝地發現它已經關閉。

+0

感謝您的神話般的信息..從您的信息我得到的是存儲數組或列表中的平均值,然後在另一個循環中更新它..我是對的 – GoCrazy 2012-07-25 08:49:17

+0

是的,類似的東西。 – 2012-07-25 08:51:13

+0

謝謝,我會嘗試它,讓你知道..並感謝您的立即支持+1的那 – GoCrazy 2012-07-25 08:52:54

2

如果您評論爲db.updateAverage(id, average),該怎麼辦?

+0

感謝您的答案..實際上'db .updateAverage(ID,平均值)是基於本次更新只有我打算下一步 – GoCrazy 2012-07-24 15:10:12

+0

@Vinoth我的意思是,如果你把它註釋掉不那麼錯誤消失'很重要..? – 2012-07-24 15:24:58

+0

對不起亞歷我現在不能測試,因爲這手機是我的朋友。我只能測試明天讓你知道..它真的有線 – GoCrazy 2012-07-24 15:33:56

0

可以實現與純粹的SQL你的目標是從景觀的建築點得更快,更好,因爲所有的邏輯將是一個SQL事務

REPLACE INTO table_where_to_put SELECT *, (totalmatchedscore/totalingredients) as average FROM table_with_input_data 

使用REPLACE OR UPDATE

相關問題