2015-06-08 43 views
0

這是我的問題的補充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要麼queryquery + "*"。如果我在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的變化如何?

+1

關閉袖口,我會假設SQLite更改FTS查詢規則和[Android 5.0使用更新版本的SQLite](http://stackoverflow.com/a/4377116/115145)。根據[FTS文檔](http://www.sqlite.org/fts3.html),它們支持令牌和令牌前綴查詢,但我不認爲它們支持令牌後綴或令牌中綴(這將是星號通配符出現在開頭的位置)。 – CommonsWare

+0

從Android 5.0開始,您可以搜索以'*'開頭的字符串。所以它不會工作。通配符只能用作後綴。 –

回答

1

MATCH '*foo*'查詢從未工作正確在任何版本的sqlite中。事實上,你得到一些結果只是一個巧合。只是前綴形式MATCH 'foo*'(和MATCH 'foo')是supported

Lollipop ships with a newer version of sqlite。有關sqlite版本之間更改的詳細列表,請參閱changelog

+0

謝謝。我個人從未使用過它,但在代碼中發現它,並在5.0出現時出現錯誤。 – sandalone