大量のデータ(「顧客」、「製品」、「注文」など)を含むAndroidアプリを設計しており、レコードが必要になるたびにSQLiteにクエリを実行する必要はありません。データベースへのクエリはできるだけ避けたいので、特定のデータを常にメモリに保持することにしました。
私たちの最初のアイデアは、2つの単純なクラスを作成することです。
「MemoryRecord」:基本的にオブジェクトの配列(string、int、double、datetimeなど)、テーブルレコードからのデータ、およびこれらのデータをこれから出し入れするためのすべてのメソッドを含むクラス。配列。
「MemoryTable」:基本的に[Key、MemoryRecord]のマップと、このマップを操作し、データベースにレコードを挿入/更新/削除するためのすべてのメソッドを含むクラス。
これらのクラスは、データベースにあるあらゆる種類のテーブルから派生します。もちろん、上記にリストされていない他の便利な方法もありますが、現時点では重要ではありません。
そのため、アプリを起動するときに、これらのクラスを使用してSQLiteデータベースからメモリにこれらのテーブルをロードし、データを変更する必要があるたびに、メモリを変更してすぐにデータベースに投稿します。
しかし、私たちはあなたからの助け/アドバイスを求めています。そのようなことを実装するために、より単純または効率的な何かを提案できますか?それとも、すでに私たちのためにそれを行っているいくつかの既存のクラスですか?
私はあなたたちが私に見せようとしていることを理解しています、そして私はそれをありがとうございます。
しかし、2000レコードのテーブルがあり、それらのレコードをリストする必要があるとしましょう。それぞれについて、他の30個のテーブル(1000レコードのテーブルと10レコードのテーブル)をクエリして、リストに追加情報を追加する必要があります。これは、「飛行中」です(ご存知のとおり、非常に高速である必要があります)。現時点で)。
ここで、「これらすべての「結合」を使用してメインクエリを作成し、必要なものをすべて1つのステップにまとめるだけです。データベースが適切に設計されている場合など、SQLiteは非常に高速になります...」と言います。
OK、しかしこのクエリは非常に複雑で確実になりますが、SQLiteは非常に高速ですが、「遅すぎる」でしょう(私が確認したように、2〜4秒で、これは私たちにとって許容できる時間ではありません)。
もう1つの複雑な点は、ユーザーの操作に応じて、関連するテーブルが同じではないため、すべてのレコードを「再クエリ」する必要があり、別のテーブルのセットに「再結合」する必要があることです。
したがって、代替手段は、結合なしでメインレコードのみを取得し(これは、ユーザーが何をしたり、望んでいるかに関係なく)、データが必要になるたびに他のテーブルにクエリを実行することです。10レコードしかないテーブルでは、同じレコードを何度もフェッチすることに注意してください。この場合、SQLiteが高速であっても、一種の「メモリキャッシュ」からレコードを取得するよりも、クエリ、カーソル、フェッチなどのコストが常に高くなるため、時間の無駄になります。すべてのデータを常にメモリに保持するのではなく、頻繁にクエリを実行する一部のテーブルだけを保持する予定であることを明確にしておきます。
そして、最初の質問に行き着きました。これらのレコードを「キャッシュ」するための最良の方法は何ですか?「なぜデータをキャッシュする必要があるのか」ではなく、それに焦点を当てて議論するのが本当に好きです。