這是我的問題的補充SQLiteDatabase Cursor empty only on Android 5.0+ devices。那個將被關閉,因爲我不確定是什麼導致了這個bug - 認爲這是一個正確填充的遊標註釋。現在我已經發現了什麼導致空遊標。與selectArgs匹配看起來像* queryTerm *停止在Android 5.0+上工作
最多的是Android 5.0,搜索建議工作通過查詢查詢數據庫:
SELECT rowid AS _id, suggest_text_1, suggest_text_2, rowid AS suggest_intent_data_id
FROM fts
WHERE (fts MATCH ?) //for example '*e*'
隨着Android 5.0以上版本的,這是行不通了。我已經做了幾十個testings和選擇查詢沒有返回Cursor
對象,如果我設置selectionArgs
到"*" + query + "*"
String selection = FTS3_TABLE + " MATCH ?";
String[] selectionArgs = new String[]{"*" + query + "*"};
在Android 5.0以上版本,將工作僅當selectionArgs
要麼query
或query + "*"
。如果我在query
之前加星號,它將停止工作。
注:我通過查詢字母e
進行測試,而不是特殊字符。
數據庫查詢看起來是這樣的,它完美地工作達到的是Android 5.0:
String[] columns = new String[]{
BaseColumns._ID,
KEY_QUESTION,
KEY_ANSWER,
SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID};
String selection = FTS3_TABLE + " MATCH ?";
String[] selectionArgs = new String[]{"*" + query + "*"};
//mColumnMap
map.put(KEY_QUESTION, KEY_QUESTION);
map.put(KEY_ANSWER, KEY_ANSWER);
map.put(KEY_CARDID, KEY_CARDID);
map.put(KEY_CARDSET, KEY_CARDSET);
map.put(BaseColumns._ID, "rowid AS " +
BaseColumns._ID);
map.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, "rowid AS " +
SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID);
map.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, "rowid AS " +
SearchManager.SUGGEST_COLUMN_SHORTCUT_ID);
//mColumnMap part ends
SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
builder.setTables(FTS3_TABLE);
builder.setProjectionMap(mColumnMap);
Cursor cursor = builder.query(db,
columns, selection, selectionArgs, null, null, null);
String temp = DatabaseUtils.dumpCursorToString(cursor); //empty string on Android 5.0+
正如你所看到的,沒有什麼複雜或特殊。
爲什麼我不能再使用含有星號兩側的查詢?
在這部分中,Android 5.0的變化如何?
關閉袖口,我會假設SQLite更改FTS查詢規則和[Android 5.0使用更新版本的SQLite](http://stackoverflow.com/a/4377116/115145)。根據[FTS文檔](http://www.sqlite.org/fts3.html),它們支持令牌和令牌前綴查詢,但我不認爲它們支持令牌後綴或令牌中綴(這將是星號通配符出現在開頭的位置)。 – CommonsWare
從Android 5.0開始,您可以搜索以'*'開頭的字符串。所以它不會工作。通配符只能用作後綴。 –