2015-08-23 2 views
0

У меня есть пользовательский поставщик поиска, который выглядит следующим образом:Android SQLite Content Provider запрос (поиск)

<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
android:hint="hint" 
android:label="label" 
android:searchSuggestAuthority="com.path_to_provider" 
android:searchSuggestIntentAction="android.intent.action.VIEW" 
android:searchSuggestIntentData="content://com.cypher.path_to_provider/table_name" 
android:searchSuggestSelection="word LIKE ? || '%' OR word LIKE '% ' || ? || '%'" /> 

Когда independentally испытано, каждая сторона OR в моем предложении поиска работает нормально. Когда я использую OR по какой-либо причине, запрос не работает. Что-то не так с моим запросом? Моя цель состоит в том, чтобы поиск «кошки» быть подобраны по «катастрофической» и «смотреть на кошек»

Вот мой ContentProvider запрос

@Override 
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
    SQLiteDatabase sqLiteDatabase = searchHelper.getReadableDatabase(); 

    return sqLiteDatabase.query("table_name", 
      projection, 
      selection, 
      selectionArgs, 
      null, 
      null, 
      null); 
} 
+0

Попробуйте положить все выражение в круглые скобки. – JimmyB

+0

вам нужен весь материал с ContentProvider, Searchable и т. Д.? вы хотите просто использовать частный SearchView в своем приложении или это часть «системного поиска»? – pskink

+0

Каким образом ваш запрос не работает? Вы получаете ошибку или всего лишь 0 результатов? –

ответ

0

Синтаксис запросов выглядит хорошо, по крайней мере, и я кажется, чтобы получить приемлемые результаты:

tmp$ sqlite3 test.db 
SQLite version 3.8.6 2014-08-15 11:46:33 
Enter ".help" for usage hints. 
sqlite> create table words (word VARCHAR(20)); 
sqlite> insert into words VALUES ("catastrophic"); 
sqlite> insert into words VALUES ("look at the cats"); 
sqlite> insert into words VALUES ("uncatty"); 
sqlite> SELECT * FROM words; 
catastrophic 
look at the cats 
uncatty 
sqlite> SELECT * FROM words WHERE word LIKE 'cat' || '%' OR word LIKE '% ' || 'cat' || '%'; 
catastrophic 
look at the cats 

(. Я вручную подставляются в «кошки» для вопросительных знаков, так как я был запущен в CLI sqlite3)

Вы сделали не s укажите, каким образом ваш запрос не работает. Если вы получаете сообщение об ошибке: может быть, вы не снабжаете достаточным количеством объектовArgs? Когда у вас есть две вопросительные знаки, ваш массив selectionArgs должен быть двумя элементами (в этом случае оба элемента будут содержать одно и то же значение). Вы могли бы также use ?1 in both places instead of just ?, например, так:

word LIKE ?1 || '%' OR word LIKE '% ' || ?1 || '%' 

Это сделает как заполнители использовать первый ARG выбора (и, следовательно, требуется только один выбор ARG).

Надеюсь, я правильно понял вашу проблему. :)

EDIT: А теперь я понимаю, что вы не контролируете параметр selectionArgs при выполнении запроса, а скорее из базы данных. Тогда да, структура, вероятно, только отправляет один аргумент, поэтому ваши многочисленные заполнители создают проблемы. В этом случае вместо? 1 вместо? определенно должен быть путь - ваш запрос потребует только одного аргумента выбора.

Смежные вопросы