2011-01-13 3 views
1

データベースヘルパークラスでdelete()コマンドを呼び出すと、アンドロイドアプリケーションのUIで遅延が発生しています。私はそれと単純なコマンドthis.db.delete( "tonightSets"、 "id =" + item_id、null)でタイマーテストを行いました。年を取って戻る。 同じクエリを繰り返し実行するためのスピードを(ミリ秒で) 1229ms 287ms 779ms 2604ms! 817ms なぜこれは遅いですか?テーブルにはレコードが30個しかなく、各行には約10個の列があります。私ははるかに複雑な複数の選択とカウント関数は、9ミリメートル未満で返す同じテーブル上でやっている これを修正するには?それは非同期的にそれを行う方法があるので、それはUIでラグを作成していないのですか? 多くのありがとうsqliteの単純なDelete()コマンドは、ほぼ1秒かかりますか?

答えて

2

どうしてこのように遅いですか?

デバイスでこれを実行している場合は、フラッシュI/Oを使用してください。 Flash I/Oは、デバイスで他に何が起こっているかによって、非常に遅くなることがあります。ほとんどのAndroidデバイスは、グローバルパーティションロックを使用してファイルシステムへのシングルスレッドアクセスを使用するYAFFS2ファイルシステムを使用します。また、フラッシュ書き込みは、ウェアレベルのバランシングなどで、まだ遅くなります。

2010 Google I | OカンファレンスのBrad Fitzpatrickの「Zippy Android Appsの作成」プレゼンテーションを見てください。そこで、彼はフラッシュに1バイトを書き込むと(通常は非常に高速ですが)、時には200ミリ秒かかることがあることを示しています。

したがって、一般的な推奨事項は、メインアプリケーションスレッドでフラッシュI/Oを実行しないことです。

これは非同期的に行うための方法ですので、UIに遅れが生じませんか?

AsyncTaskを使用してください。

+0

ありがとう、私は実際にデータベースにアクセスし、多次元配列を引き出すよりも遅く20から200倍の間に一貫して削除が行われた理由はありますが、AsyncTaskを調べます。 – jason

+0

自分自身のような新人にちょうどノート! sqliteに遅い挿入を入れて1年以上過ごした後、私は複数の挿入の 'beginTransaction()'などのコマンドを見落としていることに気付きました。それは私にデータベースへの書き込み速度を500%向上させました! – jason