【问题标题】:Slow retrieval of data in SQLITE takes a long using ContentProvider使用 ContentProvider 在 SQLITE 中缓慢检索数据需要很长时间
【发布时间】:2012-09-13 21:36:09
【问题描述】:

我在 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 + ") ";

我已将列和表名定义为字符串常量。

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

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

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

可能是什么问题?

编辑:2012 年 9 月 14 日上午 9:53

为了澄清,我使用 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;
}

【问题讨论】:

  • 使用游标,然后通过 while 循环填充 ArrayList。我对所有桌子都这样做。如果记录的数量很大,这是一个问题。但是如果记录的数量很少,它应该不会很慢。我在从有 5 条记录的表中检索数据时遇到问题,因为表 A 有 80,000 条记录。
  • 这取决于您是否也涉及表 A,然后可能需要一些时间来处理。你的查询字符串是什么?
  • 我发现了问题。请参阅下面的答案。

标签: java android performance sqlite android-contentprovider


【解决方案1】:

所以这很尴尬:

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

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

【讨论】:

  • 我又做了一些测试。当我使用光标检索数据时,速度可以忽略不计(大约一秒)。它加载到 ArrayList 需要很长时间(显然)。
猜你喜欢
  • 2017-05-05
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 2013-01-20
  • 2021-07-24
  • 1970-01-01
相关资源
最近更新 更多