2013-02-14 4 views
1

Я создаю контент-провайдер для приложения Android, но у меня проблема с правильной совпадением uri с использованием UriMatacher.UriMatcher не соответствует шаблону

Например, я добавляю в Ури, чтобы соответствовать (пропущено по ссылке)

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

С некоторыми заявлениями лесозаготовительных придачу, я вижу, что следующее:

Ури передается query дает следующее:

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

но uri.getPath() дает это:

/people/1 

Третья часть пути uri четко отбрасывается, что объясняет почему они совпадают с неправильным ури.

Пример с сайта разработчика Android, похоже, указывает на то, что с этим не должно быть никаких проблем. Я неправильно создаю uri? Это просто ошибка? Является ли это предполагаемой функциональностью (и, следовательно, пример от разработчиков Android является плохим)?

+0

Вы пытались обменять порядок «людей/#/телефонов» и «люди /» # в sURIMatcher.addURI() вызывает? – sandrstar

+0

Я попытался сменить порядок, это не повлияло. Я также попытался полностью удалить все, кроме 'people/#/phones'. В этом случае он просто не прошел мой случай по умолчанию. – CoatedMoose

ответ

3

Uri.parse() не знает подстановочные знаки UriMatcher; здесь # является идентификатором фрагмента URI, поэтому при анализе content://com.example/people/#/phones он становится content://com.example/people + фрагментом /phones. Идентификатор правильно добавлен в конец URI, а затем фрагмент переносится. В этом случае вы не можете полагаться на ContentUris, а нужно построить Ури длинный путь:

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

С вашего комментария я только что сработал. Он отлично работает – CoatedMoose

+0

Рад, что я смог помочь. Очевидным ярлыком является использование 'String.format (Locale.US," content: // authority/people /% d/phones ", id);' – 323go

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