並べ替え/フィルター処理されたクエリを使用して SQLite データベース テーブルからデータを取得し、表示するキャッシュ システムを作成しています。プルしているテーブルは潜在的に非常に大きくなる可能性があり、もちろん、メモリ内に常に最大数の行のみを保持することで、メモリへの影響を最小限に抑える必要があります。LIMIT
これは、 を使用しOFFSET
て、必要なレコードのみをロードし、必要に応じてキャッシュを更新することで簡単に実行できます。これを実装するのは簡単です。私が抱えている問題は、特定のクエリに挿入された新しいレコードの挿入インデックスがどこにあるかを判断して、UI を適切に更新できるようにすることです。これを行う簡単な方法はありますか?これまでのところ、私が持っていたアイデアは次のとおりです。
- キャッシュ全体をダンプし、クエリ結果を再カウントし (新しい行が含まれる保証はありません)、キャッシュを更新し、UI 全体を更新します。それが本当に望ましくない理由が明らかであることを願っています。
- 独自のアルゴリズムを使用して、新しい行が現在のクエリに含まれているかどうか、現在のキャッシュされた結果に含まれているかどうか、現在のキャッシュされたスコープ内にある場合はどのインデックスに挿入する必要があるかを判断します。このアプローチの最大の欠点は、その複雑さと、私自身のソート/フィルタリング アルゴリズムが SQLite のものと一致しないというリスクです。
もちろん、私が望むのは、SQLite に質問できるようにすることです。クエリ結果全体をロードせずに、「クエリ A」が「行 B」のインデックスとは何かを指定します。しかし、これまでのところ、これを行う方法を見つけることができませんでした。
問題ではないと思いますが、これはすべて iOS デバイス上で、objective-c プログラミング言語を使用して行われています。
より詳しい情報
クエリと後続のキャッシュは、ユーザー入力に基づいています。基本的に、ユーザーは再ソートおよびフィルタリング (または検索) して、表示される結果を変更できます。挿入時 (および実際には編集時) にキャッシュを単純に再作成するのをためらうのは、「よりスムーズな」UI エクスペリエンスを提供するためです。
現時点では、オプション「2」に傾いていることを指摘しておく必要があります。すべてのレコードをテーブルにロードし、独自のアルゴリズムを使用してメモリ内で並べ替え/フィルター処理を実行することで、独自のキャッシュ/インデックス システムを作成してみました。特定のレコードがキャッシュ内にあるかどうか、および/またはどこにあるかを判断するために必要なコードの多くは既にそこにあるため、私はそれを使用する傾向があります。基になるクエリと一致しないキャッシュを持つ危険性があります。クエリが返さないレコードをキャッシュに含めると、問題が発生し、おそらくクラッシュします。