私のアプリには、.sqlite ファイルに 3,000 の試験問題があります。そして、これらの質問は動的に選択され、ユーザーの要求によって並べ替えられます (たとえば、「間違った回答の数で並べ替える」、「アクセスされていない質問のみを選択する」など)。
ユーザーが選択を行うたびに、アプリは対応する SQL ステートメントを作成し、sqlite3 を使用して、すべての結果セットが NSMutableArray (Question クラス) に送信されます。ただし、お気づきのように、これには時間がかかります (約 2 ~ 3 秒かかり、その間に UI が応答しなくなります)。
したがって、rowCount() および moveToRow(int index) メソッドを持つ「カーソル」クラスを作成したいと考えています。
これで、私の考えは
Cursor c = [[Cursor alloc] init] query(
"SELECT id,qtext,answer,a1,a2,... FROM TABLE WHERE id > 100"
)];
// at this time, just a cursor is given, no need to iterate all the retrieved rows
for (i=0; i > c.rowCount(); i++) {
c.moveToRow(i);
ShowQuestionDetail(c);
}
このような。
CoreData がこの目的に適合することはわかっていますが、.sqlite ファイルをこのアプリの Android バージョンと共有する必要があります。CoreData では、すべてのテーブル名とフィールド名が Z_ プレフィックスで始まる必要がありますが、.sqlite ファイルのスキームを変更できません。また、sqlcipher を使用する必要があり、CoreData は sqlcipher では機能しません。
FMDB は、取得された行の数を示し、特定の行に移動するメソッドをサポートしていません。
この機能をサポートする他の SQLite ラッパー ライブラリはありますか?
誰かが、取得した行の ID のみを含む「カタログ」配列を作成し、moveToRow() が呼び出されるたびに行をフェッチすることを提案しています。それが良い代替案であることには同意しますが、別の方法を見つけたいと思っています。