如何在 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();
我在 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();