2

表Aに大量のデータを格納するAndroid(4.0.3を実行)のアプリケーションがあります。表AはSQLiteデータベースにあります。データベースの上の抽象化レイヤーとしてContentProviderを使用しています。

ここでの大量のデータは、1か月あたり約80,000レコードを意味します。表Aは次のように構成されています。

String SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_A + " ( " + 
        COLUMN_ID + " INTEGER PRIMARY KEY NOT NULL" + "," + 
        COLUMN_GROUPNO      + " INTEGER NOT NULL DEFAULT(0)" + "," + 
        COLUMN_TIMESTAMP    + " DATETIME UNIQUE NOT NULL" + "," + 
        COLUMN_TAG          + " TEXT" + "," + 
        COLUMN_VALUE        + " REAL NOT NULL" + "," + 
        COLUMN_DEVICEID     + " TEXT NOT NULL" + "," +
        COLUMN_NEW          + " NUMERIC NOT NULL DEFAULT(1)" + " )";

インデックスステートメントは次のとおりです。

String SQL_CREATE_INDEX_TIMESTAMP = "CREATE INDEX IF NOT EXISTS " + TABLE_A +
        "_" + COLUMN_TIMESTAMP + " ON " + TABLE_A + " (" +
        COLUMN_TIMESTAMP + ") ";

列とテーブル名を文字列定数として定義しました。

テーブルAからこのデータを取得するときに、すでに大幅な速度低下が発生しています。問題は、このテーブルからデータを取得するときに、最初にそのデータをArrayListに入れてから、表示することです。明らかに、これはおそらく間違ったやり方です。私は、ContentProviderを使用してこの問題に取り組むためのより良い方法を見つけようとしています。しかし、これは私を悩ませている問題ではありません。

問題は、何らかの理由で、最大12レコードしかない他のテーブルからデータを取得するのに非常に長い時間がかかることです。表Aのレコード数が増えると、この遅延が増えることがわかります。これは意味がありません。表Aからデータを取得すると遅延は理解できますが、他のテーブルからデータを取得する際に遅延が発生するのはなぜですか。

明確にするために、テーブルAが空であるか、レコード数が3000未満の場合、この遅延は発生しません。

何が問題なのですか?

編集:2012年9月14日9:53 AM

明確にするために、私はデータベースを管理するためにContentProviderを使用しています。データをクエリするには、context.getContentResolver()。queryメソッドを使用しています。

ContentProviderのクエリコード:

@Override
public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {
    final SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    final SQLiteDatabase db = dbHelper.getReadableDatabase();

    String tableName = getTableName(uri);

    queryBuilder.setTables(tableName);

    Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
    cursor.setNotificationUri(getContext().getContentResolver(), uri);

    return cursor;
}
4

1 に答える 1

0

だからこれは恥ずかしいです:

どうやら、アプリケーションのロード中にテーブルAからデータを取得するコードが1行あったようです。これが、アプリケーション全体の速度を低下させていました。

いずれにせよ、ContentProviderを使用してテーブルAからのデータの読み込みを最適化する方法を理解する必要があります。

于 2012-09-14T14:15:50.170 に答える