2013-02-14 114 views
1

我創建了一個Android應用程序的內容提供者,但我有一個問題,正確地匹配使用UriMatacher的URI。UriMatcher不匹配模式

例如,我添加了URI的匹配(從鏈接剪斷)

sURIMatcher.addURI("content://com.example", "people", PEOPLE); 
sURIMatcher.addURI("content://com.example", "people/#", PEOPLE_ID); 
sURIMatcher.addURI("content://com.example", "people/#/phones", PEOPLE_PHONES); 

,然後嘗試訪問contacts/people/1/phones。成功的比賽結果是PEOPLE_ID而不是PEOPLE_PHONES

查詢最初由該代碼生成的。

Uri uri = Uri.parse("content://com.example/people/#/phones"); 
ContentUris.appendId(uri.buildUpon(), 1).build(); 

隨着拋出一些記錄語句,我看到以下內容:

的URI傳遞給query給出了這樣:

content://com.example/people/1#/phones 

uri.getPath()給出了這樣的:

/people/1 

URI的第三路徑部分清楚地下降,這EXPL ains爲什麼它匹配錯誤的uri。

從Android開發者網站的例子似乎表明,不應該有這個問題。我錯誤地創建了uri嗎?它只是一個錯誤?這是預期的功能(因此android開發人員的例子是一個壞的)?

+0

你試圖交換的「人/#/手機」和「以人/#」命令sURIMatcher.addURI()調用? – sandrstar 2013-02-14 05:57:09

+0

我試過改變訂單,但沒有什麼區別。我也嘗試徹底刪除除「people /#/ phones」之外的所有內容。在那種情況下,它只是失敗到我的默認情況。 – CoatedMoose 2013-02-14 05:59:07

回答

3

Uri.parse()UriMatcher的通配符的;這裏,所述#是一個URI的片段標識符,所以當你解析content://com.example/people/#/phones,變得content://com.example/people +片段/phones。該ID被正確地追加到URI的末尾,然後該片段被結轉。在這種情況下,你不能靠ContentUris,而是需要建立開放的很長的路要走:

   path = new Uri.Builder() 
       .scheme(ContentResolver.SCHEME_CONTENT) 
       .authority(DataProvider.AUTHORITY) 
       .appendPath("people") 
       .appendPath("1") 
       .appendPath("phones")).build(); 
+0

從您的評論我剛剛完成了這一點。它完美的作品 – CoatedMoose 2013-02-14 06:23:54

+0

很高興我能夠幫助。顯而易見的捷徑是使用String.format(Locale.US,「content:// authority/people /%d/phones」,id);' – 323go 2013-02-14 06:26:15