2013-06-02 3 views
0

У меня возникли проблемы с соответствующими 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); 
+0

Вы можете показать трассировку стека и какую строку кода выдает исключение –

+0

Я сам выбрал исключение. У меня есть switch-case в методе 'query()' с результатами 'matchUri'; по умолчанию (совпадение с URI) - это обращение к 'InvalidArgumentException'. –

ответ

3

Попробуйте это:

sURIMatcher.addURI(AUTHORITY, "box", BOXES); 
sURIMatcher.addURI(AUTHORITY, "box/#", BOXES_ID); 
sURIMatcher.addURI(AUTHORITY, "box/#/item", BOX_ITEM); 
sURIMatcher.addURI(AUTHORITY, "box/#/item/#", BOX_ITEM_ID); 
sURIMatcher.addURI(AUTHORITY, "item", ITEMS); 
sURIMatcher.addURI(AUTHORITY, "item/#", ITEMS_ID); 

Порядок важен , читайте мои объяснения здесь: https://stackoverflow.com/a/15015687/534471

+0

Я понял свою проблему, она не была связана с 'UriMatcher'. Тем не менее, это очень информативно, поэтому я пойду дальше и приму это в качестве своего ответа. Надеюсь, другие найдут это полезным! –

+0

Может 'addURI (AUTHORITY," item ", ITEMS);' размещаться после 'addURI (AUTHORITY," box ", BOXES);'? –

Смежные вопросы