13

이 질문은 여러 번 물었습니다. 그러나 정확한 문제를 파악할 수 없었습니다.이미 닫힌 객체를 다시 열려고 시도합니다 : java.lang.IllegalStateException :?

다음 코드를 사용하여 데이터베이스 (Table1)에서 데이터를 가져오고 검색 값을 기반으로 다른 Table2를 업데이트합니다. 일부 안드로이드 버전에서 잘 작동하지만, Android 4.0.3으로 테스트를 마쳤습니다. 나는 java.lang.IllegalStateException:?.attempt to re-open an already-closed objectsum_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

어쩌면 당신은 폐쇄 한 비동기 태스크 외부의 데이터베이스. 그걸 확인해 봤어? –

+0

일부 경쟁 조건이 발생할 수있는 경우 사용중인 다른 시스템보다 빠르게 4.0.3이 실행되고있는 시스템입니까? –

+0

아니, 괜찮다고 생각합니다. – GoCrazy

답변

23

쿼리 결과를 반복하는 동안 테이블을 업데이트 할 수 없습니다. 이것에 대한 좋은 이유가 있습니다. 추가하는 데이터로 인해 반복되는 데이터가 변경되면 어떻게 될까요? 커서가 유효한 데이터를 반환하지 않습니다.

updateAverage()의 테이블에 다시 데이터를 저장하려고하면 문제가 발생합니다. 루프 동안의 평균값을 기억하고 커서를 루핑 한 후 끝에 한 번 업데이트해야합니다.

정확한 오류에 대해 자세히 설명하려면 다음과 같이하십시오. 새 데이터를 삽입하면 데이터베이스가 안전 조치로 현재 열려있는 모든 커서를 닫습니다. 따라서 평균을 업데이트 한 후 sum_cursor.moveToNext()으로 전화하면 커서는 이미 닫혀 있음을 알게되면 조금 놀랐습니다.

+0

당신의 멋진 정보를 주셔서 감사합니다. 내가 가진 정보는 배열 또는 목록 평균 값 및 다른 루프에서 업데이트 할 수 있습니다. 내가 맞아. – GoCrazy

+0

그래, 뭔가 그런. –

+0

감사합니다. 나는 그것을 시도하고 알려 드리겠습니다. 그리고 즉각적인 지원 +1에 감사드립니다. – GoCrazy

2

db.updateAverage(id, average)을 주석 처리하면 어떻게됩니까?

+0

답변 해 주셔서 감사합니다. 실제로'db .updateAverage (id, average)'는 매우 중요합니다.이 업데이트에만 기반하여 다음 단계로갑니다 – GoCrazy

+0

@Vinoth 내 말은, 만약 당신이 코멘트를한다면 오류가 사라지 겠다는 겁니까? –

+0

죄송합니다. 알렉스는 전화가 내 친구 였기 때문에 지금 테스트 할 수 없습니다. 내일에만 테스트하고 알려 드리겠습니다. 정말 유선합니다. – GoCrazy

0

당신은 모든 로직을 하나의 SQL 트랜잭션에있을 것입니다 있기 때문에 빠르고 더 나은보기의 아키텍처 관점에서

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

사용 REPLACE 또는 UPDATE 순수한 SQL과 목표를 달성 할 수

관련 문제