3

CursorAdapterを使用してデータを表示するListActivityがあります。このデータは、Webサービス呼び出しの結果です。

org.json。*ライブラリを使用して解析し、結果をアプリのSQLite3データベースに書き込んで、Webサービス呼び出しから応答を取得しています。次に、ListActivityのカーソルが再クエリされ、データがリストに表示されます。

私の問題は、データベースの書き込みが非常に遅いことです。私が考えることができる唯一のことは、CursorAdapterを使用せず、このデータをメモリに保持することです。私は誰かが物事をスピードアップするための別の提案を持っていることを望んでいました。おそらく、ある種のバルクインサート?

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

LAN経由で56行のデータを取得して表示したテストの結果を次に示します。

応答までの時間:178ms

jsonを解析する時間:16ms

データベースに56行を書き込む時間:5714ms

最終的には、この量のデータに対してデータベースの書き込みにかかる時間を1000ミリ秒未満にしたいと思います。

4

2 に答える 2

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();
}

これにより、100 行の挿入 (この状況ではバッチのサイズ) が約 30 秒から 300 ミリ秒程度に短縮されました。

于 2011-07-01T19:58:56.147 に答える
0

データベースに書き込む行ごとにラウンドトリップを行いますか?それとも、それらすべてを 1 回のラウンドトリップにまとめることができますか? バッチ処理を行っていない場合、ネットワーク遅延が原因であるに違いありません。

于 2011-07-01T19:36:37.060 に答える