我正在为Android应用程序创建内容提供程序,但我在使用UriMatacher正确匹配uri时出现问题。
例如,我添加了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的第三个路径部分明显被删除,这就解释了为什么它与错误的uri相匹配。
来自Android开发者网站的示例似乎表明这应该没有问题。我是否错误地创建了uri?这只是一个错误吗?这是预期的功能(因此Android开发人员的例子很糟糕吗?)
答案 0 :(得分:3)
Uri.parse()
不知道UriMatcher
的通配符;这里,#
是URI的片段标识符,因此当您解析content://com.example/people/#/phones
时,它变为content://com.example/people
+片段/phones
。 id正确地附加到URI的末尾,然后片段被转移。在这种情况下,你不能依赖ContentUris
,而是需要建立Uri很长的路:
path = new Uri.Builder()
.scheme( ContentResolver.SCHEME_CONTENT )
.authority( DataProvider.AUTHORITY )
.appendPath( "people" )
.appendPath( "1" )
.appendPath( "phones" ) ).build();