2013-06-02 16 views
0

ContentProvider에 일치하는 URI가있는 데 문제가 있습니다. 하나 또는 두 개의 "태그"가있는 경로와 일치합니다 (정확한 용어가 무엇인지는 확실하지 않음). 예를 들어 box/#을 인식 할 수 있습니다. 그러나 두 번째 태그 (예 : box/#/item)를 추가하자마자 InvalidArgumentException을 던지고 내 앱이 다운됩니다. 여기에 여러 스레드에서이 문제가 때때로 UriMatcher에 추가 된 URI의 순서를 변경하여 해결할 수 있다고 읽었습니다. 나는 이것을 시도했지만 아무 소용이 없었다. 문제가 무엇인지 누구나 알고 있습니까? 나는 아래 코드의 일부를 발췌했다. 에서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

나는 예외를 던졌습니다. 나는 'matchUri'의 결과와 함께'query()'메소드에서 switch-case를 가졌다; 디폴트 (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, "box", BOXES);'뒤에 추가 할 수 있습니까? –

관련 문제