Ankidroid で発生した DB の問題を修正しようとしています。次のステートメントが実行されました。
SELECT count(*) FROM cards c WHERE type = 1 AND combinedDue <
1335153600.000000
そこに生成された。実行されるコードは次のとおりです ( github リンク)。
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)
何か案が?
実際、私は同様のケースをもっと見ていました。「グローバル」列を持つテーブル «Stats» があり、そこには 1 つのグローバル レコードと多数の日次レコードが存在する可能性があります。(単純なselectで) グローバル レコードが見つからない場合は、グローバル レコードを作成します。私の電話では、グローバル レコードが見つからないことがあるようです。上で示したケースのように見えます。
編集:
理由がわかりました。別のスレッドでは、AsyncTask がクエリの実行と同時に DB を閉じます (GUI によってトリガーされる多くの処理が非同期で行われるため)。そして、レコードのないカーソルを返します。
ファイルにトレースを追加することでそれを確認しました。