我正在尝试对搜索对话框进行自定义建议。我正在使用urimatcher来匹配uri。但它不起作用。我总是得到异常“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.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>
....
....
答案 0 :(得分:4)
为避免讨论,如果您提供更多信息,我将更改此答案......
但是现在......
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;
}
如果您没有看到差异,我添加了“tests /”
所以现在它将匹配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);
修改强>:
AUTHORITY + "tests/" + SearchManager.SUGGEST_URI_PATH_QUERY
应与android:searchSuggestIntentData
!!!
EDIT2:
selection android:searchSuggestSelection中提供的值 您的可搜索配置文件的属性,如果有,则为null 没有声明android:searchSuggestSelection属性。更多关于 使用它来获得下面的查询。 selectionArgs包含搜索 查询作为数组的第一个(也是唯一的)元素(如果有) 声明你的android:searchSuggestSelection属性 可搜索的配置。如果你还没有申报 android:searchSuggestSelection,则此参数为null。更多 关于使用它来获得下面的查询。
添加android:searchSuggestSelection=" ? "