RESTFul Android ContentProvider URI - PullRequest
       37

RESTFul Android ContentProvider URI

2 голосов
/ 09 января 2012

Чтобы быть RESTful, URI для получения комментариев к сообщению должен выглядеть примерно так:

posts/#/comments

Где # - это идентификатор сообщения, который будет меняться в зависимости от того, какое сообщение вас интересует.

Я хочу применить некоторые правила при разработке URI контента моего провайдера контента.Вопрос в том, как пользователь поставщика контента должен элегантно построить такой URI?

Возможное решение:

//in PostProvider
public static URI CONTENTS_URI_POSTS = Uri.parse("content://" + AUTHORITY + "/posts");
public static String COMMENTS = "comments";

Тогда пользователь будет использовать Uri.builder объединить CONTENTS_URI_POSTS + id + COMMENTS.Однако этот метод предоставляет подробные сведения о том, как создать URI.

Чтобы скрыть подробности, возможно, я мог бы добавить метод:

 public static URI  buildContentUriToGetPostComments(int post_id);

Есть идея получше?Спасибо!

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Вы можете использовать разные пути для сообщений и их комментариев:

content://<authority>/posts/#<post-id>
content://<authority>/comments/#<post-id>

Таким образом, у вас есть URI, который выглядит более обычным и его проще обрабатывать в поставщике контента, вам не нужно анализировать URI, но подойдет стандартный UriMatcher.

1 голос
/ 20 августа 2012

Не для того, чтобы воспитывать что-то старое, но у меня возникают проблемы с реализацией этого отношения один-ко-многим ... Если я буду следовать подходу Стефана:

content://<authority>/comments/#<post-id>

Что если я позже захочу добавить URI, чтобы получить конкретный комментарий по идентификатору?

content://<authority>/comments/#<comment-id> 

Вышеуказанное создаст совпадение с предыдущим URI.

В моем случае я попытался решить эту проблему с помощью

content://<authority>/posts/comments/#<post-id>

Однако это решение может вызвать проблемы. Например, если я хочу загрузить курсор, используя оба:

content://<authority>/comments/  (all comments)
content://<authority>/posts/comments/#<post-id> (comments by post)

и вставьте комментарий, используя:

content://<authority>/comments

Не все пользователи ContentProvider будут уведомлены, поскольку шаблон URI не совпадает.

Чтобы решить эту проблему, я удостоверяюсь, что мой ContentProvider вызывает notifyChange с добавленным идентификатором к ОБОИ URI «get all» И URI «get by post id» ... это всего лишь одно решение.

Есть ли какие-либо недостатки в реализации этого способа? Оглядываясь назад, вероятно, было бы проще просто положиться на пользователя, устанавливающего внешний ключ в строке выбора запроса ContentProvider ... но, как и Pierr, я хотел реализовать его как один URI.

...