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