1

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 によってトリガーされる多くの処理が非同期で行われるため)。そして、レコードのないカーソルを返します。

ファイルにトレースを追加することでそれを確認しました。

4

1 に答える 1

1

if (cursor.moveToFirst == false)! を使用する代わりに試してください。オペレーター。あなたが現在行っている方法は、常にifの本体にあなたを渡すことになると思います。そして、カーソルは適切に初期化されていません.moveToFirstがなければ.

于 2012-05-02T19:25:22.747 に答える