У меня возникли проблемы с соответствующими URI в моем ContentProvider
. Он будет соответствовать путям с одним или двумя «тегами» (не уверен, что такое правильный термин), например, он может распознать box/#
. Но как только я добавляю второй тег, например box/#/item
, я бросаю InvalidArgumentException
, и мое приложение падает. Я читал в нескольких потоках здесь, что эту проблему иногда можно решить, изменив порядок URI, добавленных в UriMatcher
; Я пробовал это, но безрезультатно. Кто-нибудь знает, в чем проблема? Я привел соответствующие части моего кода ниже.UriMatcher не распознающий шаблон
С моей ContentProvider
:
private static final String AUTHORITY = "com.example.boxdatabase.DatabaseProvider";
// Type of query
public static final int BOXES = 100;
...
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
...
// URI Matcher for queries
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sURIMatcher.addURI(AUTHORITY, "box/#/item", BOX_ITEM);
sURIMatcher.addURI(AUTHORITY, "box/#/item/#", BOX_ITEM_ID);
sURIMatcher.addURI(AUTHORITY, "box", BOXES);
sURIMatcher.addURI(AUTHORITY, "box/#", BOXES_ID);
sURIMatcher.addURI(AUTHORITY, "item", ITEMS);
sURIMatcher.addURI(AUTHORITY, "item/#", ITEMS_ID);
}
Пример того, где я пытаюсь получить доступ к моей ContentProvider
и он терпит неудачу:
return new CursorLoader(this, Uri.withAppendedPath(
DatabaseProvider.CONTENT_URI, "box/" + boxId + "/item"),
DatabaseContract.BoxItemEntry.ALL_COLUMNS, null, null, null);
Вы можете показать трассировку стека и какую строку кода выдает исключение –
Я сам выбрал исключение. У меня есть switch-case в методе 'query()' с результатами 'matchUri'; по умолчанию (совпадение с URI) - это обращение к 'InvalidArgumentException'. –