UriMatcher与模式不匹配

时间:2013-02-14 05:54:19

标签: android uri android-contentprovider

我正在为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开发人员的例子很糟糕吗?)

1 个答案:

答案 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();