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();
    }
}