如何在 Android 中加快游标到数组列表的转换?

How to speed up cursor conversion to arraylist in Android?

我在 Andriod 应用程序中从本地数据库查询数据时遇到了性能问题。虽然索引在将 Cursor 转换为 ArrayLists 时有助于加快查询本身的速度,但确实很费时间。

转换代码如下:

public MaData recordToSimpleItem(Cursor cursor) { 
  return new MaData( 
      cursor.getString(cursor.getColumnIndex(SQLiteHelper.COLUMN_ACTION)), 
      cursor.getFloat(cursor.getColumnIndex(SQLiteHelper.COLUMN_AMP)), 
      cursor.getFloat(cursor.getColumnIndex(SQLiteHelper.COLUMN_POLLUTION))
  ); 
}
................................................................
ArrayList<T> items = new ArrayList<>();
cursor.moveToFirst();
while (!cursor.isAfterLast() && !cursor.isBeforeFirst()) {
    items.add(recordToSimpleItem(cursor));
    cursor.moveToNext();
}
cursor.close();

这似乎是从游标获取内容的标准方式,因此,确实找不到其他提供更高性能的方法。

现在将计数为 300 的游标转换为数组列表需要 2 秒......真的很高兴知道是否有更好更快的方法来执行此操作。否则,一旦数据库变大,就会出现严重的问题。

如有任何帮助,我们将不胜感激!

您可以采取一些措施来加快该过程。

首先,只计算一次游标中列的索引,而不是在循环的每次迭代中计算,并直接在 while 块中使用它们。
这意味着您不应使用 recordToSimpleItem() 方法,尽管它看起来是一种将游标行转换为 MaData 对象的优雅方法,但它可能会显着延迟循环。

此外,没有理由在每次迭代中检查 isAfterLast()cursor.isBeforeFirst()
您只需要检查一次 moveToFirst(),确保至少有 1 行,然后在处理每一行后调用 cursor.moveToNext()

ArrayList<T> items = new ArrayList<>();

int indexAction = cursor.getColumnIndex(SQLiteHelper.COLUMN_ACTION);
int indexAmp = cursor.getColumnIndex(SQLiteHelper.COLUMN_AMP);
int indexPollution = cursor.getColumnIndex(SQLiteHelper.COLUMN_POLLUTION);

if (cursor.moveToFirst()) {
    do {
        items.add(new MaData( 
                          cursor.getString(indexAction), 
                          cursor.getFloat(indexAmp), 
                          cursor.getFloat(indexPollution)
                      )
        );
    } while (cursor.moveToNext());
}
cursor.close();