MATCH 与 selectArgs 看起来像 *queryTerm* 在 Android 5.0+ 上停止工作
MATCH with selectArgs looking like *queryTerm* stopped working on 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+ 开始,这不再有效。我已经做了几十次测试,如果我将 selectionArgs
设置为 "*" + query + "*"
,select 查询 returns 对 Cursor
对象没有任何影响
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 这部分有什么变化?
这是我的问题
在 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+ 开始,这不再有效。我已经做了几十次测试,如果我将 selectionArgs
设置为 "*" + query + "*"
Cursor
对象没有任何影响
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 这部分有什么变化?