使用ContentProvider在SQLITE中缓慢检索数据需要很长时间

时间:2012-09-13 21:36:09

标签: java android performance sqlite android-contentprovider

我在Android(运行4.0.3)中有一个应用程序,它在表A中存储了大量数据。表A驻留在SQLite数据库中。我使用ContentProvider作为数据库上方的抽象层。

这里的大量数据意味着每月近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 + ") ";

我已将列和表名定义为String Constants。

从表A中检索此数据时,我已经遇到了明显的减速问题。问题是,当我从此表中检索数据时,我首先将它放在ArrayList中然后显示它。显然,这可能是错误的做事方式。我试图找到一种更好的方法来使用ContentProvider来解决这个问题。但这不是困扰我的问题。

问题是出于某种原因,从其他最多只有12条记录的表中检索数据需要花费更长的时间。随着表A中的记录数量的增加,我看到这种延迟增加。这没有任何意义。如果我从表A中检索数据,我可以理解延迟,但是为什么从其他表中检索数据的延迟。

澄清一下,如果表A为空或记录少于3000,我不会遇到此延迟。

可能是什么问题?

编辑:09/14/2012 9:53 AM

为了澄清,我使用ContentProvider来管理数据库。要查询数据,我使用的是context.getContentResolver()。查询方法。

我在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;
}

1 个答案:

答案 0 :(得分:0)

所以这很令人尴尬:

显然,在Application Load期间某处有一行代码正在从表A中检索数据。这就是整个应用程序运行速度变慢的原因。

无论如何,我仍然需要弄清楚如何使用ContentProvider优化表A中的加载数据。