模糊查找 再深入
應某位大哥要求 再次對 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~~~