我正在嘗試對搜索對話框進(jìn)行自定義建議.我正在使用urimatcher來匹配uri.但它不起作用.我總是得到異?!?a >java.lang.IllegalArgumentException:Unknown 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.SuggestionProvider11-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=5011-30 14:16:35.424: E/DatabaseUtils(1638): Writing exception to parcel11-30 14:16:35.424: E/DatabaseUtils(1638): java.lang.IllegalArgumentException: Unknown Uri: content://com.simple.search.SuggestionProvider/search_suggest_query/?limit=5011-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" />
表現(xiàn)
........ <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>........
解決方法:
為避免討論,如果您提供更多信息,我將更改此答案…
但現(xiàn)在 …
xml中有android:searchSuggestIntentData =“content://com.simple.search.SuggestionProvider/tests”
所以你必須改變
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;}
如果你沒有看到差異我添加“測試/”
所以現(xiàn)在它將匹配內(nèi)容://com.simple.search.SuggestionProvider/tests/search_suggest_query?limit = 50這正是QSB將發(fā)送的內(nèi)容……
無論如何,你可以/應(yīng)該為你的查詢添加限制
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);
編輯:
AUTHORITY“tests /”SearchManager.SUGGEST_URI_PATH_QUERY應(yīng)該與android:searchSuggestIntentData相同!!!
EDIT2:來自doc http://developer.android.com/guide/topics/search/adding-custom-suggestions.html
selection The value provided in the android:searchSuggestSelection
attribute of your searchable configuration file, or null if you have
not declared the android:searchSuggestSelection attribute. More about
using this to get the query below. selectionArgs Contains the search
query as the first (and only) element of the array if you have
declared the android:searchSuggestSelection attribute in your
searchable configuration. If you have not declared
android:searchSuggestSelection, then this parameter is null. More
about using this to get the query below.
添加android:searchSuggestSelection =“?”
來源:https://www.icode9.com/content-4-269451.html