与selectArgs匹配,看起来像* queryTerm *已停止在Android 5.0+上运行

时间:2015-06-08 12:53:58

标签: android android-sqlite android-5.0-lollipop

这是我的问题SQLiteDatabase Cursor empty only on Android 5.0+ devices的补遗。那个将被关闭,因为我不知道是什么导致了这个错误 - 认为这是一个光标注释正确填充。现在我发现了导致空光标的原因。

在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+开始,这不再适用了。我做了几十次测试,如果我将Cursor设置为selectionArgs

,则select查询不会向"*" + query + "*"对象返回任何内容
String selection = FTS3_TABLE + " MATCH ?";
String[] selectionArgs = new String[]{"*" + query + "*"};

在Android 5.0+上,仅当selectionArgsqueryquery + "*"时,它才有效。如果我在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 个答案:

答案 0 :(得分:1)

MATCH '*foo*'查询在任何版本的sqlite中都没有正确。你之前得到一些结果这一事实只是一个巧合。只有前缀格式MATCH 'foo*'(和MATCH 'foo')为supported

Lollipop ships with a newer version of sqlite。有关sqlite版本之间更改的详细列表,请参阅changelog