2012-05-02 3 views
1

나는 Ankidroid에서 가지고 있던 DB 문제를 해결하려고합니다. 다음 문이 실행되었습니다."count (*)"에 대한 rawQuery는 행을 반환하지 않습니다.

SELECT count(*) FROM cards c WHERE type = 1 AND combinedDue < 
1335153600.000000 

there이 생성되었습니다. 실행 코드는 다음 (github link)입니다 :

cursor = mDatabase.rawQuery(query, null); 
if (!cursor.moveToNext()) { 
    throw new SQLException("No result for query: " + query); 
} 

내가, 내가 가야 내가 어떤 기록을 얻을 수있는 방법을 이해할 수 없다 1 또는 0은 로그의 호출 스택은 다음이었다

at com.ichi2.anki.Deck.rebuildRevCount(Deck.java:1351) 
    Caused by: android.database.SQLException: No result for query: …… 
at com.ichi2.anki.AnkiDb.queryScalar(AnkiDb.java:129) 
at com.ichi2.anki.Deck._rebuildRevCount(Deck.java:1621) 

아이디어가 있으십니까?

사실 나는 비슷한 경우를 더 보았습니다. 하나의 글로벌 레코드와 많은 일일 레코드가있을 수있는 "글로벌"컬럼이있는«통계»테이블이 있습니다. 전역 레코드가 발견되지 않으면 (단순 선택), 우리는 그것을 만듭니다. 제 전화에서 언젠가는 세계 기록이 발견되지 않는 것 같아요. 그래서 우리는 일을 망가 뜨리는 추가 기록을 만듭니다. 정말 위와 같은 경우처럼 보입니다.

편집 :

나는 이유를 발견했다. 다른 스레드에서 AsyncTask는 쿼리가 수행되는 동안 DB를 닫습니다 (GUI에서 트리거되는 많은 처리가 비동기 적으로 수행되기 때문에). 그리고 레코드가없는 커서를 반환합니다.

파일에 추적을 추가하여 보았습니다.

답변

1

시도해보십시오 if (cursor.moveToFirst == false)! 운영자. 제 생각에 당신이 현재하고있는 방식은 항상 그렇게 할 것입니다. 당신을 if의 몸으로 빠져 나가십시오. 그리고 a.moveToFirst없이 커서가 제대로 초기화되지 않습니다.

+0

+1 ..이 IMHO를 수행하는 데있어 "표준"이며 읽기 쉬운 방법입니다. – Joe

+0

감사합니다. 나는 그것이 하루에 한 번 발생하기 때문에 즉시 알 수 없습니다. 어쨌든 _rawQuery_는 -1 위치에 커서를 반환해야하기 때문에 이상한 점이 있지만 그 순간 가장 좋은 결과를 얻었습니다. – Fabimaru

+0

작동하는지 알려주세요. – Barak

관련 문제