1

SQLite DB からカーソルとしてランダムな 20 の質問 (行) を取得し、すべての質問をループしてユーザーに 20 の質問すべてを尋ねる Android アプリを持っています。

アクティビティが一時停止または停止されたときにカーソルの状態/位置を保存して、アクティビティが再開されたときにカーソルが復元され、アクティビティが一時停止/停止されたときと同じ位置になるようにする方法はありますか?

私のコードを投稿する必要がある場合は、お尋ねください。

御時間ありがとうございます!

4

1 に答える 1

2

その位置を保存するのは非常に簡単です。次のように onPause メソッドにコードを追加するだけです。

protected void onPause(){
 position = yourCursor.getPosition();
 super.onPause();
}

ここで、position はクラス フィールドです (つまり、メソッドの外側で、通常は上部で宣言されます)。次に、onResume でカーソルをその位置に戻すことができます。onPause()/onResume() に慣れていない場合は、アクティビティのライフサイクルを読んでください。. ただし、ランダムに選択された質問も保存したいと思われます。メモリの問題を回避するために onPause で一般的に閉じられているため、カーソルが onPause/onResume にまたがって保持されるとは思いません。私が考えることができる唯一のことは、私は専門家ではありませんが、質問の行 ID を保存してから、データベースを再クエリしてそれらの行を取得する必要があるということです。その解決策がどれほど不器用かは、最初にランダムな質問をどのようにクエリするかによって異なります。すでに 20 個の乱数を生成してクエリに入力している場合は、同じ方法を再利用できますが、代わりに 20 個の保存された行を使用できます。


これは長すぎてコメントに収まりませんでした:

@Ryan: 確かに、同じカーソルを再作成できない場合、カーソルの状態なしで位置を保存することはほとんど役に立ちません。それが私の返信の後半で言ったことです。あなたの RANDOM() は標準の SQL 関数だと思いますか? (ちなみに、Android での構文は何ですか?データベースに受け入れさせることができませんでした。) もしそうなら、ブルート フォース メソッドを実行してカーソルを再作成する必要があるかもしれません。つまり、「rowId = ? OR rowId = ? OR rowId = ? OR ....」でデータベースを再クエリし、選択引数は元のカーソルから取得したrowIdsです。それはきれいではなく、おそらくもっと良い方法がありますが、それはうまくいきます。次のようなループを使用すると、SELECT 文字列を簡単に作成できます。

String selectQuery = "";
String[] selectArgs = new String[savedRows.length];
for (int i = 0; i < savedRows.length; i++){
    selectQuery = selectQuery.concat("rowID = ? OR ");
    selectArgs[i] = Long.toString(savedRows[i]);
}

//Remove the last " OR " you'd have in the string
int index = selectQuery.lastIndexOf(" OR ");
selectQuery = selectQuery.substring(0, index);

これは、rowIds を元のカーソルからlong[] savedRowsonPause メソッドの に保存することを前提としています。その後、それらを新しいデータベース クエリに渡すことができます。


繰り返しますが、コメントには長すぎます:

@Ryan: 良い点、同じ順序で引き戻されない可能性があります。実験して確認することはできますが、常に同じ順序で返されるのがまぐれなのか、設計によるものなのかを判断するのは困難です。アイデア 3 は、20 個のランダムな質問で満たされた中間テーブルを作成することです。このテーブルには、行番号の列 (質問の順序を示します) と、質問テーブル内の質問の rowId を含む外部キー列があります。このテーブルから同じ順序で質問を取得するのは簡単です。ユーザーがすべての質問を終了したら、テーブルを削除できます。または、ユーザーが過去の問題セットでどれだけうまくいったかを確認できるようにテーブルを保持することもできますが、それはまったく別の機能です.

注: 最初の投稿で onSaveInstanceState についても触れておくべきでした。onPause は、アクティビティを変更する前にすばやく保存するのに適していますが、単純に位置を int に保存するのは簡単ではありません。明らかに、ユーザーが新しいクイズを開始するとリセットされますが (そうあるべきです)、ユーザーが別のアクティビティを見ている間に OS がメモリのためにプロセスを強制終了しなければならなかった場合にもリセットされます。その場合、ユーザーがアクティビティに戻ったときに onCreate から再開する必要があるため、変数データが​​失われます。これは、データを保存できる Bundle を提供する onSaveInstanceState() メソッドと連携することを目的としています。この同じ Bundle が onCreate で提供され、必要なものをリロードして、アプリが強制終了されていないように見せることができます。

于 2010-04-27T20:23:13.747 に答える