2011-07-01 13 views
3

私は、いくつかのデータを表示するためにCursorAdapterを使用するListActivityを持っています。このデータはWebサービス呼び出しの結果です。データベース書き込みのスピードアップ

Webサービスコールから、org.json。*ライブラリを使用して解析し、その結果をアプリケーションのSQLite3データベースに書き込んでいます。 ListActivityのCursorが再度照会され、データがリストに表示されます。

私の問題は、データベースの書き込みが遅すぎることです。私が考えることができる唯一のことは、CursorAdapterを使用せず、このデータをメモリに保持することです。私は誰かが物事をスピードアップするために別の提案をしたいと考えていました。おそらく一種の一括挿入?

私は挿入を行うためにContentProviderを使用していることに注意してください。そこで私はgetContentResolver()。insert(...)を呼び出します。応答へ

時間:ここで

は、LANを介したデータの56行で取得し、それらを表示されたテストからいくつかの時間があるJSONを解析する178ms

時間:書き込みに16msの

時間データベースへの56行:5714ms

このデータ量では、最終的にデータベース書き込み時間が1000ms未満になると思います。

+0

私はコードを見たいと思う、これは本当に遅いようです。 –

+0

トランザクションを使用してデータをブロックとしてブロックに書き込みますか? – thaussma

+0

私はContentProvider – Andrew

答えて

2

私はいくつかの問題がありましたが、最初にデータベースのbeginTransaction()を呼び出すと挿入クエリを実行したことがわかりました。コード例:

public void insertClassBatch(ArrayList<Class> batch) throws Exception 
{ 
    this.getWritableDatabase().beginTransaction(); 
    for (Class c : batch) 
    { 
     this.insertClassStatement.bindString(1, c.getClassName()); 
     this.insertClassStatement.bindString(2, c.getClassValue()); 
     this.insertClassStatement.executeInsert(); 
    } 
    this.getWritableDatabase().setTransactionSuccessful(); 
    this.getWritableDatabase().endTransaction(); 
} 

これは、約30秒から300ms程度の間に100行(この状況ではバッチのサイズ)を挿入することを減らしています。

0

データベースに書き込む行ごとに往復するのか、それともすべてを1回の往復にバッチすることができますか?あなたがバッチ処理をしていなければ、ネットワーク遅延が原因であると私は思います。

+0

を使用していることを示すためにOPを更新しました。getContentResolver()。insert(...)からgetContentResolver()。bulkInsert(...)に変更しました。これによりレイテンシの一部は軽減されましたが、それほど多くはありません。私はまだ約5000msで私を残して、約700msを落としました。 – Andrew

関連する問題