Diferença exata entre “Provedor de conteúdo” e “Banco de dados SQLite”

87

Já fiz programação de banco de dados SQLite para Android, mas não sei nada sobre o Provedor de Conteúdo, exceto isto: "Como mencionei a página do desenvolvedor Android, o Android SDK explicou sobre o" Provedor de conteúdo ", pois é usado para armazenar e recuperar dados."

Mas então,

  1. Qual é a diferença exata entre "Content-Provider" e "SQLite Database"?
  2. Qual é o melhor para armazenar dados, quando?

Qualquer exemplo ou ajuda !!

Paresh Mayani
fonte

Respostas:

134

Encontrei uma grande diferença, como segue:

Armazenar seus dados em um banco de dados é uma boa maneira de persistir seus dados , mas há uma ressalva no Android: os bancos de dados criados no Android são visibleapenas para o aplicativo que os criou. Ou seja, um banco de dados SQLite criado no Android por um aplicativo pode ser usado apenas por esse aplicativo, não por outros aplicativos.

Portanto, need to share data between applications, you need to use the content provider model as recommended in Android.este artigo apresenta os princípios básicos dos provedores de conteúdo e como você pode implementá-los.

Encontrei este artigo neste link

Informações muito boas fornecidas.

Paresh Mayani
fonte
2
Parece que o link está morto agora ... não vejo mais o artigo. Gostaria de ver o artigo que você está fazendo referência se encontrá-lo novamente.
prolink007
em 11 de fevereiro de 2012, o link http://www.devx.com/wireless/Article/41133 funciona,
k3b
E se fornecermos mecanismos no processo para compartilhar os dados entre vários aplicativos de uma maneira thread-safe?
Manohar
2
Outra vantagem adicional é que os provedores de conteúdo usam um único thread para cada operação, então vários threads não podem modificar o banco de dados como em um caso de sqlite
Rat-a-tat-a-tat Ratatouille
54

Qual é a diferença exata entre "Provedor de conteúdo" e "Banco de dados SQLite"?

ContentProvideré uma fachada - uma API que você pode implementar que expõe bancos de dados a outros processos. Ele pode ser implementado de uma forma onde os dados são armazenados em um banco de dados SQLite, mas ele não tem que ser.

Qual é o melhor para armazenar dados, quando?

Isso é impossível de responder em abstrato. De modo geral, a menos que algo exija que você use um ContentProvider, apenas use um banco de dados.

CommonsWare
fonte
26
Eu prefiro usar um ContentProvider, pois é uma abstração muito boa sobre SQL. Você também pode jogar bem com CursorAdapter e consultas automáticas.
alexanderblom
26

Eu fiz muitos aplicativos bons com milhares de usuários usando-os, que simplesmente usavam métodos SQLite. Mas isso foi há um tempo e eu tive que escrever manualmente muitos códigos que agora podem ser facilmente tratados pelo ContentProvider. Naquela época, eu não era a favor do uso de provedores de conteúdo porque parecia apenas adicionar complexidade ao código.

No entanto, nos últimos dois anos, conforme o Android evoluiu, mudei para ContentProvider, pois ele economiza tempo e permite que você faça muito mais. Agora eu o uso extensivamente. Depois de escrever uma classe de Provedor de Conteúdo, sua vida se torna muito mais fácil. Com ContentProvider posso lidar muito facilmente com Cursor Loaders, Loader Callbacks e Bulk Inserts para os quais eu tive que escrever tudo manualmente no passado e ainda não funcionou tão eficientemente. Especialmente ao atualizar a exibição de lista, que agora é atualizada automaticamente graças a apenas um método notchange (). Isso significa que agora não preciso digitar meus próprios ouvintes e atualizar manualmente o conteúdo em visualizações de lista e adaptadores. Além disso, não preciso me preocupar em abrir e fechar bancos de dados ou me preocupar com vazamentos de memória. Tudo isso é tratado pelo Provedor de Conteúdo. O único problema que enfrento de vez em quando é que você não pode fazer algumas consultas complexas em ContentProviders. Neste caso, você ainda pode usar consultas brutas e usar a interação manual antiquada com sqlite.

Se você já escreveu seu próprio DbAdapter, Helper e Observer, pode carregá-los com segurança para seus novos aplicativos sem perder tempo convertendo tudo para ContentProvider. Mas, com base na minha experiência, eu recomendo mudar para ContentProvider. Vai levar algum tempo para se acostumar com isso, mas assim que você tiver experiência, você vai continuar.

ATUALIZAÇÃO 2017 Agora mudei para o Realm , uma maneira muito melhor de usar bancos de dados em qualquer plataforma. Passe algumas horas aprendendo e economize incontáveis ​​horas em sua carreira de desenvolvimento de aplicativos.

Zeeshan
fonte
Eu estava pensando em converter meu código para provedor de conteúdo, mas agora penso em mantê-lo.
Mohammed Subhi Sheikh Quroush
Agora você também pode adicionar a biblioteca 'Room' do Android
Ravindra Kushwaha
8

1. Provedores de conteúdo não são seguros para threads

Por padrão, os provedores de conteúdo não são seguros para threads. Se você tiver vários threads usando um provedor de conteúdo, poderá ver muitas exceções diferentes sendo lançadas e outras inconsistências de dados. A maneira mais fácil de corrigir isso é usar a palavra-chave synchronized em cada um dos métodos públicos expostos pelo provedor de conteúdo.

Dessa forma, apenas um encadeamento por vez pode acessar esses métodos.

2. Jogue bem ao fazer muitas gravações

Tenho a necessidade no novo aplicativo Serval Maps de importar dados de arquivos binários para o banco de dados usado internamente pelo aplicativo. Para fazer isso e jogar bem com o resto do aplicativo, é melhor:

Gerar um novo encadeamento para realizar a importação para que outros encadeamentos não sejam afetados negativamente, em particular o encadeamento encarregado de atualizar a IU; e Faça uma breve pausa no final de cada importação para dar mais chance aos outros threads que precisam usar os métodos sincronizados.

3. Provedores de conteúdo forçam você a pensar lateralmente às vezes

A maneira como os provedores de conteúdo funcionam no Android é fornecer uma camada de abstração entre o restante do seu código e o banco de dados subjacente. Isso se deve principalmente ao fato de que, até onde sei, os provedores de conteúdo podem acessar dados de outros lugares que não bancos de dados.

Isso significa que você não pode executar consultas SQL brutas no banco de dados subjacente e precisa especificar os vários componentes de uma consulta SQL usando variáveis ​​passadas para os vários métodos, como o método de consulta. Se você tem uma tarefa que não se encaixa na maneira como o SQL é tratado por um provedor de conteúdo, você tem duas opções:

Pense lateralmente sobre a consulta, talvez você possa obter os dados de que precisa por meio de consultas alternativas e acessando os resultados com o cursor; e Use um URI para acessar os dados normalmente e um URI especial que corresponda a uma consulta específica para as tarefas que não têm alternativas.

chanu
fonte
de acordo com ContentProvider, seis métodos abstratos de ContentProvider que precisam ser implementados podem ser chamados por vários threads de uma vez, portanto, devem ser implementados como thread-safe. A classe abstrata ContentProvider não é a razão das exceções de um código específico, mas da implementação. Siga Processos e Threads para implementar métodos seguros de thread de ContentProvider.
StahlRat
5

Provedores de conteúdo são usados ​​quando você deseja compartilhar seus dados entre aplicativos.

Se você tem um banco de dados anexado a um aplicativo e deseja que outro aplicativo use alguns dados, você pode implementar um provedor de conteúdo que expõe os dados

Mina Samy
fonte
3

A principal diferença é: quando seu aplicativo precisa compartilhar informações com outros aplicativos, use o provedor de conteúdo. SQLite apenas dados de armazenamento para o aplicativo que os cria

daniel uribe ayvar
fonte
3

Eu li esta resposta enquanto procuro a mesma dúvida, então pensei em compartilhá-la. afirma -

É uma boa prática fornecer um nível extra de abstração sobre seus dados para facilitar a alteração interna. E se você decidir alterar a estrutura do banco de dados subjacente posteriormente? Se você usar um ContentProvider, você pode conter todas as mudanças estruturais dentro dele, onde, como se você não usar um, você é forçado a mudar todas as áreas do código que são afetadas pelas mudanças estruturais. Além disso, é bom ser capaz de reutilizar a mesma API padrão para acessar dados em vez de sujar seu código com acesso de baixo nível ao banco de dados.

Portanto, usar um provedor de conteúdo seria uma boa ideia.

Darpan
fonte
3

Pense em sistemas avançados de gerenciamento de conteúdo. Cada objeto (página, imagem, artigo de notícias, item de evento, etc.) tem um conteúdo, um endereço, permissões de usuário e maneiras de interagir com ele de diferentes partes do sistema. Provedores de conteúdo fazem isso para Android. Agora você pode compartilhar arquivos ou imagens que possa ter armazenado em seu aplicativo. Você também pode criar objetos compartilháveis ​​personalizados, como contatos comerciais, notas editáveis, etc. E especificar a segurança e o aplicativo padrão para lidar com esse objeto ao abri-lo em qualquer outro aplicativo.

Roberto
fonte