UriMatcher不会与uri相匹配

时间:2011-12-06 01:12:13

标签: android uri

我正在尝试对搜索对话框进行自定义建议。我正在使用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>
....
....

1 个答案:

答案 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 !!!

相同 来自文档http://developer.android.com/guide/topics/search/adding-custom-suggestions.html

EDIT2:

  

selection android:searchSuggestSelection中提供的值   您的可搜索配置文件的属性,如果有,则为null   没有声明android:searchSuggestSelection属性。更多关于   使用它来获得下面的查询。 selectionArgs包含搜索   查询作为数组的第一个(也是唯一的)元素(如果有)   声明你的android:searchSuggestSelection属性   可搜索的配置。如果你还没有申报   android:searchSuggestSelection,则此参数为null。更多   关于使用它来获得下面的查询。

添加android:searchSuggestSelection=" ? "