Значение android.content.UriMatcher

Что такое Uri Matcher в android.content.UriMatcher

Как его использовать? Может ли кто-нибудь объяснить смысл следующих трех строк кода?

  uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  uriMatcher.addURI(PROVIDER_NAME, "cte", uriCode);
  uriMatcher.addURI(PROVIDER_NAME, "cte/*", uriCode);
  int res = uriMatcher.match(uri);

Ответ 1

UriMatcher - удобный класс, когда вы пишете ContentProvider или какой-либо другой класс, который должен отвечать на несколько разных URI. В вашем примере пользователь может запросить у вашего провайдера URI, например:

myprovider://cte

или

myprovider://cte/somestring

Когда вы создаете UriMatcher, вам нужно иметь отдельные коды для каждого URI (а не только "uriCode", как в вашем примере). Обычно я делаю свой экземпляр UriMatcher статическим и добавляю URI в статическом конструкторе:

private static final int CTE_ALL = 1;
private static final int CTE_FIND = 2;
private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
    uriMatcher.addURI(PROVIDER_NAME, "cte", CTE_ALL);
    uriMatcher.addURI(PROVIDER_NAME, "cte/*", CTE_FIND);
}

Затем в вашем ContentProvider вы сделаете что-то вроде этого в своем методе запроса:

Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    int res = uriMatcher.match(uri);
    switch (res) {
        case CTE_ALL:
            //TODO create a results Cursor with all the CTE results
            break;
        case CTE_FIND:
            //TODO create a results Cursor with the single CTE requested
            break;
    }
    return results;
}

Ответ 2

Я нашел следующие видеоролики полезными:

Основы URI

URI Matcher

В сущности, то, что вы пытаетесь сделать, - это идентификатор или число, связанное с разными URI. Когда вы используете addUri, код/​​номер/идентификатор создается против URI. Когда вы запрашиваете совпадение(), возвращается соответствующий код.