模糊查找 再深入
应某位大哥要求 再次对 SQLite::query(...) 学习了一番 有点心得 不敢独吞 与大家讨论之
[前言]
本例打算以android系统联系人为例演示 该联系人记录初始数据为:
[代码 步骤]
1. 自定义 即:不使用系统提供的query(...) 为什么:因为开始也不清楚系统query(...) 各参数所代表含义 只能自己扩展之
* 通过ContentResolver 查询目标Uri 返回Cursor
Cursor c = getContentResolver().query(People.CONTENT_URI,
null, null, null, null);
* 定义query2ByCursor(Cursor c,String columnName,String filter ) 现一一说明各参数意思
函数参数解释:
String[] query2ByCursor(Cursor c,String columnName,String filter )
1. paras:
- Cursor c : 查询目标
- String columnName : 模糊查询目标的索引列名 i.g. 查询所有联系人中 记录名字含有字串"sh"的名单 那么该值应为:"名单" 即"People.NAME"
- String filter : 模糊查询设置的条件 i.g. 上面例子中 该值应为"sh"
2. return: 返回所有匹配查询条件的记录
函数实现为:
public String[] query2ByCursor(Cursor c,String columnName,String filter){
List<String> vlist = new ArrayList<String>();
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
int iNameIndex = c.getColumnIndex(columnName);
String string = c.getString(iNameIndex);
if(string.contains(filter)){
vlist.add(string);
}
}
String[] result = new String[vlist.size()];
vlist.toArray(result);
return result;
}
函数使用为: 还是以那个例子为例 其具体传递参数
String[] data = query2ByCursor(c,People.NAME,"sh");
其他 包括:使用String[] 并显示值
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);
setListAdapter(adapter);
emulator 运行截图:
2. 以上是使用自扩展函数 下面说说怎么利用系统提供query(...) 还是那个问题
Cursor c = getContentResolver().query(People.CONTENT_URI,
null, "name like '%sh%'", null, null);
模糊查找:
String selection: "name like '%sh%'"
意思: 查找所有列名为: name 且其包含字串"sh" 的记录 %匹配所有字串
3. 下面在介绍下一个参数: String[] selectionArg 的使用情况
使用说明:
其会替代参数String selection 中的 '?' 且依次代替
例子: 查找名字为"griffin" 或者 "nichlas" 的记录 则:函数及参数为:
Cursor c = getContentResolver().query(People.CONTENT_URI,
null, "name = ? or name = ?", new String[]{"griffin","nichlas"}, null);
其等效于:
Cursor c = getContentResolver().query(People.CONTENT_URI,
null, "name = griffin or name = nichlas", null, null);
其实 ContentResolver.query(....) 用法 遵循与SQLite.query(...)
any idea or other are welxome~~~