2

sqliteとAndroid2.3.7で深刻なパフォーマンスの問題が発生しています。

保存するデータが少量あります。それぞれ8列の14行です。データはWebページから読み取られます。データが解析されると、データベースのコンテンツ全体を削除してから、新しいデータを一度に一括挿入します。

一部の(編集された)LogCat出力:

03-15 14:39:51.909: Got content downloaded.
03-15 14:39:52.299: Deleting existing info from db.
03-15 14:39:52.719: Bulk inserting new data into db.
03-15 14:40:00.709: Stored data in the database.

ContentProviderを使用してデータベースにアクセスしています。

ページの解析には0.4秒かかります。

削除には0.4秒かかります。

BulkInsertには8秒かかります。

その後のクエリとすべてのデータの読み取りには、約0.4秒かかります。

関連するコードスニペット:

    Log.v(TAG, "Deleting existing info from db.");
    delete(API_TABLE, null, null);
    Log.v(TAG, "Bulk inserting new data into db.");
    bulkinsert(API_TABLE, allValues);
    Log.v(TAG, "Stored data in the database.");

フィールドおよびタイプデータ:

public final static String[] API_KEYS = {KEY_STATION, KEY_API, 
    KEY_POLLUTANT, KEY_SO2, KEY_NOX, KEY_CO, KEY_PHOTO, KEY_TSPRSP, 
    KEY_RSP};
public final static String[] API_TYPES = {"TEXT PRIMARY KEY", "TEXT", 
    "TEXT", "TEXT", "TEXT", "TEXT", "TEXT", "TEXT", "TEXT"};

データベースの構築は次のように行われます。

        StringBuilder dbCommand = new StringBuilder();
        dbCommand.append("CREATE TABLE " + API_TABLE + " (");
        dbCommand.append("'" + API_KEYS[0] + "' " + API_TYPES[0]);
        for (Integer i = 1; i < API_KEYS.length; i++)
            dbCommand.append(", '" + API_KEYS[i] + "' " + API_TYPES[i]);
        dbCommand.append(");");
        Log.v(TAG, "Creating API database now.");
        db.execSQL(dbCommand.toString());

挿入する値はContentValues[]オブジェクトに保存され、を使用して挿入されます

context.getContentResolver().bulkInsert(API_URI, values);

これを改善する方法について何かアイデアはありますか?特に、挿入には時間がかかりすぎます。

4

2 に答える 2

2

StinePike からの返信に基づいて、プロバイダー クラスを次のように変更しました。

@Override
public int bulkInsert(Uri uri, ContentValues[] values) {

    String table = getTable(uri);
    int count = 0;
    for (ContentValues value : values) 
        count += db.insert(table, "", value);

    return count;

}

これにより、挿入時間が少し改善されますが、値が 14 個だけの場合、4 ~ 5 秒はまだ少し長くなります。

次に、この方向でもう少し検索すると、実際に速度が向上する別のソリューションが見つかりました現在、1秒未満に短縮されています。それは許容範囲ですが、これ以上改善できるとは思いません。このコードは、ContentProvider 拡張クラスの一部です。

    @Override
public int bulkInsert(Uri uri, ContentValues[] values) {
    try {
        db.beginTransaction();
        String table = getTable(uri);
        for (ContentValues value : values)
            db.insert(table, null, value);
        db.setTransactionSuccessful();
    } catch (SQLException e) {
    } finally {
        db.endTransaction();
    }
    return values.length;   
}
于 2013-03-15T09:23:29.743 に答える
0

この操作にはSQLiteDatabaseクラスを使用します。

次の方法で挿入しましたが、比較的高速でした

public void createContatctDirectory(ArrayList<String> data) {
    SQLiteDatabase db = context.openOrCreateDatabase(DATABASE_NAME,
            Context.MODE_PRIVATE, null);

    InsertHelper ih = new InsertHelper(db, TABLE_NAME);
    Iterator<String> it = data.iterator();
    final int numberColumn = ih.getColumnIndex(KEY_NUMBER);

    db.beginTransaction();
    int count = 0;
    try {
        while (it.hasNext()) {
            ++count;
            String ph;
            ph = it.next();
            ih.prepareForInsert();
            ih.bind(numberColumn, ph);

            ih.execute();
        }
    } finally {
        ih.close();
        db.setTransactionSuccessful();
        db.endTransaction();
        db.close();
    }
}
于 2013-03-15T07:46:04.543 に答える