13

Tôi biết câu hỏi này đã hỏi nhiều lần trong SO, nhưng tôi không thể tìm ra vấn đề chính xác của tôi.Cố gắng mở lại một đối tượng đã đóng: java.lang.IllegalStateException :?

Tôi đang sử dụng mã sau để lấy dữ liệu từ cơ sở dữ liệu (Bảng 1) và cập nhật Bảng 2 khác dựa trên giá trị truy xuất. Nó hoạt động tốt trong một số phiên bản Android nhưng khi tôi đi kiểm tra với Android 4.0.3. Tôi đang nhận được điều này java.lang.IllegalStateException:?.attempt to re-open an already-closed object tại sum_cursor.moveToNext();.

Tôi đang sử dụng mã này trong 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(); 

phương pháp cập nhật của tôi mã hóa

/** 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); 
} 

gì tôi đang làm sai ở đây?

Tôi biết nhiều bạn gặp phải tình huống này. Bạn có thể giúp tôi không.

Cảm ơn sự giúp đỡ của bạn.

+0

Có lẽ bạn đã đóng cơ sở dữ liệu bên ngoài tác vụ không đồng bộ. Bạn đã kiểm tra điều đó chưa? –

+0

Hệ thống 4.0.3 đang chạy nhanh hơn các hệ thống khác bạn đang sử dụng, nếu bạn có thể có một số điều kiện chủng tộc xảy ra. –

+0

Không, tôi nghĩ điều đó tốt .. – GoCrazy

Trả lời

23

Bạn không thể cập nhật bảng trong khi lặp qua kết quả truy vấn. Có nhiều lý do tốt cho việc này; điều gì xảy ra nếu dữ liệu bạn đang thêm sẽ gây ra thay đổi đối với dữ liệu bạn đang lặp lại? Con trỏ của bạn sẽ không trả lại dữ liệu hợp lệ.

Cố gắng lưu trữ dữ liệu trở lại bảng trong updateAverage() đang gây ra sự cố. Bạn chỉ nên nhớ giá trị trung bình trong vòng lặp của bạn, và sau đó cập nhật nó một lần ở cuối sau khi bạn đã hoàn thành vòng lặp trên con trỏ của bạn.

Để giải thích thêm về lỗi chính xác mà bạn nhận được: hành động chèn dữ liệu mới đang khiến cơ sở dữ liệu đóng tất cả các con trỏ hiện đang mở, như một biện pháp an toàn. Vì vậy, khi bạn gọi sum_cursor.moveToNext() sau khi cập nhật mức trung bình, con trỏ sẽ hơi ngạc nhiên khi thấy rằng nó đã bị đóng.

+0

Cảm ơn thông tin tuyệt vời của bạn .. Từ thông tin của bạn những gì tôi có được lưu trữ các giá trị trung bình trong mảng hoặc danh sách và sau đó cập nhật nó trong vòng lặp khác .. Am i right – GoCrazy

+0

Có, một cái gì đó như thế. –

+0

cảm ơn tôi sẽ thử nó và cho bạn biết .. và cảm ơn sự hỗ trợ trực tiếp của bạn +1 cho rằng – GoCrazy

2

Điều gì xảy ra nếu bạn nhận xét ra db.updateAverage(id, average)?

+0

cảm ơn câu trả lời của bạn .. thực sự 'db .updateAverage (id, trung bình) 'là rất quan trọng .. dựa trên bản cập nhật này chỉ tôi sẽ bước tiếp theo – GoCrazy

+0

@Vinoth Ý tôi là, nếu bạn bình luận nó ra thì lỗi đó biến mất? –

+0

xin lỗi alex tôi không thể kiểm tra bây giờ vì điện thoại đó là bạn của tôi .. tôi có thể kiểm tra chỉ vào ngày mai và cho bạn biết .. nó thực sự có dây – GoCrazy

0

Bạn có thể đạt được mục tiêu của bạn với SQL tinh khiết nó là nhanh hơn và tốt hơn từ quan điểm kiến ​​trúc của Xem vì tất cả các logic sẽ được trong một giao dịch SQL

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

Sử dụng REPLACE HOẶC UPDATE

Các vấn đề liên quan