Android 从游标读取数据
示例
这是SQLiteOpenHelper子类内部方法的示例。它使用searchTerm字符串来筛选结果,通过游标的内容迭代,并在返回这些内容List的Product对象。
首先,定义ProductPOJO类,该类将成为从数据库检索到的每一行的容器:
public class Product {
long mId;
String mName;
String mDescription;
float mValue;
public Product(long id, String name, String description, float value) {
mId = id;
mName = name;
mDescription = description;
mValue = value;
}
}然后,定义将查询数据库,并返回该方法List的Product对象:
public List<Product> searchForProducts(String searchTerm) {
//当读取数据时,总是应该只获得一个可读的数据库。
final SQLiteDatabase database = this.getReadableDatabase();
final Cursor cursor = database.query(
//要读取的表的名称
TABLE_NAME,
//应该读取的列的字符串数组
new String[]{COLUMN_NAME, COLUMN_DESCRIPTION, COLUMN_VALUE},
//选择参数,指定要读取的行。
//?符号是参数。
COLUMN_NAME + " LIKE ?",
//选择的实际参数值是一个String数组。
//?以上从这里取值
new String[]{"%" + searchTerm + "%"},
//GroupBy子句。指定列名称以将相似值分组
//在该列中。
null,
//有条款。使用GroupBy子句时,您可以
//指定要包括的组。
null,
//OrderBy子句。在此处指定列名以对结果进行排序
//根据该列。(可选)附加ASC或DESC以指定
//升序或降序。
null
);
//要提高性能,请首先获取游标中每一列的索引
final int idIndex = cursor.getColumnIndex(COLUMN_ID);
final int nameIndex = cursor.getColumnIndex(COLUMN_NAME);
final int descriptionIndex = cursor.getColumnIndex(COLUMN_DESCRIPTION);
final int valueIndex = cursor.getColumnIndex(COLUMN_VALUE);
try {
//如果moveToFirst()返回false,则光标为空
if (!cursor.moveToFirst()) {
return new ArrayList<>();
}
final List<Product> products = new ArrayList<>();
do {
//使用上面获取的索引读取表中一行的值
final long id = cursor.getLong(idIndex);
final String name = cursor.getString(nameIndex);
final String description = cursor.getString(descriptionIndex);
final float value = cursor.getFloat(valueIndex);
products.add(new Product(id, name, description, value));
} while (cursor.moveToNext());
return products;
} finally {
//完成操作后,请勿忘记关闭Cursor,以避免内存泄漏。
//在本示例中,使用try/finally通常是处理此问题的最佳方法
cursor.close();
//关闭数据库
database.close();
}
}