SQLite データベースを使用する Windows Phone 8 アプリケーションがあります。データベースにアクセスするには、Andy Wigley ( source )による WinRT Wrapper を使用します。
私のデータベースは非常に単純で、テーブルは 1 つだけです: 場所: 整数主キー "FieldIndex"、varchar "Field1"、varchar "Field2"、varchar "Field3"、varchar "Field4"、varchar "Field5"、varchar "Field6"、int 「カテゴリーID」
「FieldIndex」と「CategoryID」の両方にもインデックスがあります。
テーブルには合計 4000 のエントリがあり、データベースのサイズは 900 kB です。また、データベースを圧縮しました (vacuum)。データベースは、アプリケーション コンテンツとして電話機に展開されます (= インストール フォルダ内 = 読み取り専用)。データベースはクエリにのみ使用します。私のデータ アクセス コードは次のようになります。
using (var db = new SQLiteWinRTPhone.Database(Package.Current.InstalledLocation, @"Model\db.sqlite"))
{
await db.OpenAsync(SQLiteWinRTPhone.SqliteOpenMode.OpenRead);
await db.ExecuteStatementAsync("PRAGMA journal_mode = MEMORY");
await db.ExecuteStatementAsync("PRAGMA temp_store = 2;");
using (var stmt = await db.PrepareStatementAsync("SELECT * FROM Locations;"))
{
int i = 0;
while (await stmt.StepAsync())
{
// There is nothing happening here
// Just for testing. In my real code, I iterate on all rows and store them in a object. I wanted isolate the issue here.
i++;
}
}
MessageBox.Show("We read " + i.toString() + " records.");
}
現時点では、上記のステートメントが完了するまでに 20 秒かかります。私の立場からすると、これは容認できません。アプリケーションのプロファイリングを試みましたが、ホットパスはネイティブ コード ライブラリ (主に ConcRT 関連) にあります。WinRT ラッパーは「リリース」としてコンパイルされており、なぜパフォーマンスが悪いのかわかりません。
GOAL : すべての行を読み取り、ビューへのバインド、検索などのためにオブジェクトに格納したいと考えています。
データベースクエリをある程度受け入れられるようにするためにできることはありますか (< 5 秒)?