Por que foi criado o ContentProvider do Android?

11

O título resume minha pergunta, mas para elaborar basicamente o que eu quero entender é por que os designers do Android querem que os aplicativos que precisam trabalhar com dados compartilhados usem um provedor de conteúdo em vez de apenas acessar o banco de dados SQLite diretamente?

A única razão pela qual consigo pensar é na segurança, porque certos arquivos podem ser acessados ​​apenas em certos processos e, dessa forma, o Provedor de Conteúdo é o gatekeeper que garante que cada aplicativo tenha os privilégios adequados antes de permitir acesso de leitura e / ou gravação ao arquivo do banco de dados. Essa é a principal razão pela qual o ContentProvider foi criado?

satur9nine
fonte

Respostas:

6

É, acima de tudo, uma maneira de isolar os consumidores e fornecedores de dados. Você desenvolve seu próprio provedor de conteúdo ou amplia um já existente se deseja tornar alguns de seus dados públicos ou pelo menos disponíveis para outro aplicativo.

É verdade que esse servidor pode controlar os acessos do ponto de vista da segurança, mas também permite que você refaça a implementação física de seus dados sempre que desejar. Tudo o que você precisa fazer é adaptar o back-end do seu provedor de conteúdo nesse caso. Os aplicativos de consumidor de dados não precisarão ser reescritos. Eles continuarão acessando seus dados por meio do resolvedor de conteúdo, sem que haja nenhuma alteração na implementação subjacente real.

Além disso, o Android instancia apenas uma instância do seu provedor de conteúdo, mesmo que os dados sejam acessados ​​por vários clientes, para que ele cuide de acessos simultâneos sem que você precise se preocupar com isso.

Finalmente, acredito que ele também lidará com a labuta de arranque e desligamento limpos.

Alain Pannetier
fonte
11
Eu acho que o isolamento é provavelmente a melhor resposta. Não concordo com o seu ponto de vista sobre o acesso simultâneo, o SQLite e a interface Java do Android lidam com a simultaneidade, o próprio ContentProvider permite que vários threads simultâneos consultem / insiram / atualizem, para que realmente não esteja fazendo nada por você.
satur9nine
3

O ContentProvidertambém abstrai a toda a comunicação inter-processo que é necessário para se comunicar com outros aplicativos de terceiros. Ter que escrever esse código você mesmo seria uma grande dor.

Alex Lockwood
fonte
Os terceiros sempre podem acessar o arquivo do banco de dados diretamente, sem necessidade de comunicação entre processos.
Satur9nine 15/10/12
Não sei o que você quer dizer ... se um aplicativo é um "terceiro", por definição, ele deve existir em um processo diferente (já que todo aplicativo Android tem seu próprio processo principal). Além disso, se o sistema operacional Android permitisse que você tivesse acesso direto aos armazenamentos de dados brutos de outros aplicativos, isso geraria alguns problemas de segurança bastante grandes.
Alex Lockwood
1

O ContentProvider também é uma abstração que oculta os detalhes de como os dados são armazenados / gerados. Por exemplo, em um dos meus aplicativos, tenho um provedor de conteúdo que retorna imagens PNG. Essas imagens não são armazenadas em nenhum lugar, elas são geradas sob demanda.

Dan Dyer
fonte