UriMatcher не будет соответствовать uri

Я пытаюсь сделать пользовательское предложение для поиска в диалоговом окне. Я использую urimatcher для соответствия uri. Но это не работает. Я всегда получаю исключение "java.lang.IllegalArgumentException: Неизвестно Uri: content: //com.simple.search.SuggestionProvider/search_suggest_query/? Limit = 50". Пожалуйста, объясните это мне. Что я могу сделать, чтобы решить эту проблему?

private static final UriMatcher sURIMatcher = makeUriMatcher(); public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // Use UriMatcher, to find out what type of request received. Next, form // the corresponding query to the database switch (sURIMatcher.match(uri)) { case SEARCH_SUGGEST: if (selectionArgs == null) { throw new IllegalArgumentException( "selectionArgs must be provided for the Uri: " + uri); } return getSuggestions(selectionArgs[0]); case SEARCH_TESTS: if (selectionArgs == null) { throw new IllegalArgumentException( "selectionArgs must be provided for the Uri: " + uri); } return search(selectionArgs[0]); case GET_TEST: return getRecord(uri); default: throw new IllegalArgumentException("Unknown Uri: " + uri); } 

makeUrimatcher

 private static UriMatcher makeUriMatcher() { UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); // For the record matcher.addURI(AUTHORITY, "tests", SEARCH_TESTS); matcher.addURI(AUTHORITY, "tests/#", GET_TEST); // For suggestions table matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGEST); matcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH_SUGGEST); return matcher; } 

LogCat

 11-30 14:16:27.295: I/ActivityThread(1638): Publishing provider com.simple.search.SuggestionProvider: com.simple.search.SuggestionProvider 11-30 14:16:35.424: D/com.simple.search.com.simple.search.SuggestionProvider(1638): Unknown Uri: content://com.simple.search.SuggestionProvider/search_suggest_query/?limit=50 11-30 14:16:35.424: E/DatabaseUtils(1638): Writing exception to parcel 11-30 14:16:35.424: E/DatabaseUtils(1638): java.lang.IllegalArgumentException: Unknown Uri: content://com.simple.search.SuggestionProvider/search_suggest_query/?limit=50 11-30 14:16:35.424: E/DatabaseUtils(1638): at com.simple.search.SuggestionProvider.query(SuggestionProvider.java:122) 11-30 14:16:35.424: E/DatabaseUtils(1638): at android.content.ContentProvider$Transport.bulkQuery(ContentProvider.java:117) 11-30 14:16:35.424: E/DatabaseUtils(1638): at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:98) 11-30 14:16:35.424: E/DatabaseUtils(1638): at android.os.Binder.execTransact(Binder.java:287) 11-30 14:16:35.424: E/DatabaseUtils(1638): at dalvik.system.NativeStart.run(Native Method) 

searchable.xml

 <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:hint="@string/search_hint" android:label="@string/app_label" android:searchSuggestAuthority="com.simple.search.SuggestionProvider" android:searchSuggestIntentAction="android.intent.action.VIEW" android:searchSuggestIntentData="content://com.simple.search.SuggestionProvider/tests" /> 

манифест

 .... .... <activity android:label="@string/app_name" android:name=".SimpleSearch" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> </activity> .... .... 

Чтобы избежать обсуждения, я изменю этот ответ, если вы предоставите дополнительную информацию …

но сейчас …

У вас есть android:searchSuggestIntentData="content://com.simple.search.SuggestionProvider/tests" в xml

Поэтому вам нужно изменить

 private static UriMatcher makeUriMatcher() { UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); // For the record matcher.addURI(AUTHORITY, "tests", SEARCH_TESTS); matcher.addURI(AUTHORITY, "tests/#", GET_TEST); // For suggestions table matcher.addURI(AUTHORITY, "tests/" + SearchManager.SUGGEST_URI_PATH_QUERY, SEARCH_SUGGEST); matcher.addURI(AUTHORITY, "tests/" + SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH_SUGGEST); return matcher; } 

Если вы не видите различия, я добавил «тесты /»

Так что теперь он будет соответствовать content://com.simple.search.SuggestionProvider/tests/search_suggest_query?limit=50 что именно то, что отправит QSB …

В любом случае вы можете / должны добавить ограничение по вашему запросу

 case SEARCH_SUGGEST: if (selectionArgs == null) { throw new IllegalArgumentException( "selectionArgs must be provided for the Uri: " + uri); } final String limit = uri.getQueryParameter(SearchManager.SUGGEST_PARAMETER_LIMIT); return getSuggestions(selectionArgs[0], limit); 

А затем в getSuggestions

 helper.getReadableDatabase().query(table, projection, selection, selectionArgs, null, null, sortOrder, limit); 

EDIT :

AUTHORITY + "tests/" + SearchManager.SUGGEST_URI_PATH_QUERY должен быть таким же, как android:searchSuggestIntentData !!!

EDIT2: от doc http://developer.android.com/guide/topics/search/adding-custom-suggestions.html

Selection Значение, указанное в атрибуте android: searchSuggestSelection вашего файла с возможностью поиска, или null, если вы еще не объявили атрибут android: searchSuggestSelection. Подробнее об использовании этого, чтобы получить запрос ниже. SelectionArgs Содержит поисковый запрос как первый (и единственный) элемент массива, если вы объявили атрибут android: searchSuggestSelection в своей поисковой конфигурации. Если вы не объявили android: searchSuggestSelection, то этот параметр равен NULL. Подробнее об использовании этого, чтобы получить запрос ниже.

Добавить android:searchSuggestSelection=" ? "