UriMatcher не будет соответствовать Uri - PullRequest
4 голосов
/ 06 декабря 2011

Я пытаюсь сделать собственное предложение для поиска в диалоге.Я использую 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 Ответ

4 голосов
/ 06 декабря 2011

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

, но пока ...

у вас есть 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;
}

, если вы не видите различий, я добавил "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: из документа http://developer.android.com/guide/topics/search/adding-custom-suggestions.html

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

add android:searchSuggestSelection=" ? "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...