Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Visão geral do armazenamento de dados e arquivos

O Android oferece várias opções para você salvar os dados do seu aplicativo. A solução escolhida depende das suas necessidades específicas, como o tipo de dados que você precisa armazenar, quanto espaço eles exigem e se essas informações devem ser privadas ou acessíveis a outros aplicativos e aos usuários.

Esta página apresenta as diferentes opções de armazenamento de dados disponíveis no Android:

Com exceção de alguns tipos de arquivos em armazenamento externo, todas essas opções são destinadas a dados privados. Ou seja, os dados não são naturalmente acessíveis a outros aplicativos. Se você quiser compartilhar arquivos com outros aplicativos, use a API FileProvider. Para saber mais, leia Como compartilhar arquivos.

Se você quiser expor os dados de um aplicativo a outros, use um ContentProvider. Os provedores de conteúdo oferecem controle total sobre o acesso de leitura/gravação disponível para outros aplicativos, independentemente do meio de armazenamento escolhido para os dados (embora geralmente seja um banco de dados). Para saber mais, leia Provedores de conteúdo.

Armazenamento interno

Por padrão, os arquivos salvos no armazenamento interno são privados e não podem ser acessados por outros aplicativos (nem por um usuário, a menos que ele tenha acesso à raiz). Isso torna esse tipo de armazenamento um bom local para dados internos do aplicativo que o usuário não precisa acessar diretamente. Ele oferece um diretório privado no sistema de arquivos para cada aplicativo, onde você pode organizar todos os documentos relacionados.

Se um usuário desinstalar seu aplicativo, os arquivos salvos no armazenamento interno serão removidos. Devido a esse comportamento, você não deve usar o armazenamento interno para salvar algo que o usuário espera manter independentemente do seu aplicativo. Por exemplo, se o aplicativo permitir que os usuários capturem fotos, deve ser possível acessá-las mesmo depois de desinstalar o software. Por isso, use a API MediaStore para salvar esses tipos de arquivos na coleção de mídia apropriada.

Para saber mais, leia como salvar um arquivo no armazenamento interno e como usar MediaStore para reproduzir músicas com base em uma consulta de pesquisa.

Arquivos de cache internos

Se você quiser manter alguns dados temporariamente, em vez de armazená-los permanentemente, salve-os em um diretório de cache especial. Cada aplicativo tem um diretório de cache particular especificamente para esses tipos de arquivos. Quando houver pouco espaço de armazenamento interno no dispositivo, o Android poderá excluir esses arquivos de cache para liberar espaço. No entanto, não dependa do sistema para limpar esses arquivos. Mantenha sempre você mesmo os arquivos de cache e respeite um limite razoável de espaço consumido, como 1 MB. Se o usuário desinstalar seu aplicativo, esses arquivos serão removidos.

Para saber mais, consulte como gravar um arquivo de cache.

Armazenamento externo

Todos os dispositivos Android são compatíveis com um espaço compartilhado de “armazenamento externo” que pode ser usado para salvar arquivos. Esse espaço é chamado de externo porque não é garantido que esteja acessível. Ele pode ser ativado em um computador como um dispositivo de armazenamento externo ou ser fisicamente removível (como um cartão SD). Os arquivos salvos no armazenamento externo podem ser lidos por todos e modificados pelo usuário quando o armazenamento em massa de USB é ativado para transferir arquivos para um computador.

Portanto, antes de tentar acessar um arquivo no armazenamento externo do seu aplicativo, verifique a disponibilidade dos diretórios de armazenamento externos, bem como dos arquivos que você está tentando acessar.

Na maioria das vezes, você deve usar armazenamento externo para dados do usuário que precisam estar acessíveis a outros aplicativos. Além disso, essas informações precisam ser salvas mesmo se o usuário desinstalar seu aplicativo, como fotos capturadas ou arquivos transferidos por download. O sistema fornece diretórios públicos padrão para esses tipos de arquivos. Assim, o usuário pode ter um local para todas as suas fotos, toques, músicas e outros conteúdos.

Você também pode salvar arquivos no armazenamento externo em um diretório específico, que será excluído pelo sistema quando o usuário desinstalar o aplicativo. Essa pode ser uma alternativa útil ao armazenamento interno se você precisar de mais espaço. Porém, isso não garante que os arquivos estejam acessíveis, já que o usuário poderá remover o cartão SD de armazenamento. Além disso, os arquivos podem ser lidos globalmente, mas são salvos em um local que não é compartilhado com outros aplicativos.

Para saber mais, leia como salvar um arquivo em um armazenamento externo.

Preferências compartilhadas

Caso você não precise armazenar muitos dados nem exija muita estrutura, use SharedPreferences. As APIs SharedPreferences permitem ler e gravar pares de chave-valor persistentes de tipos de dados primitivos: booleanos, flutuantes, números inteiros, dados longos e strings.

Os pares de chave-valor são gravados em arquivos XML que ficam nas sessões do usuário, mesmo que o aplicativo seja excluído. Você pode especificar manualmente um nome para o arquivo ou usar arquivos por atividade para salvar seus dados.

O nome da API “preferências compartilhadas” é um pouco enganador porque ela não serve estritamente para salvar “preferências do usuário”, como o toque escolhido. Use SharedPreferences para salvar qualquer tipo de dados simples, como a pontuação alta do usuário. No entanto, se você quiser salvar as preferências do usuário para seu aplicativo, leia como criar uma IU de configurações, que usa o AndroidX Preference Library para gerar uma tela de configurações e manter essas definições.

Para saber como armazenar qualquer tipo de dados de chave-valor, leia Salvar dados de chave-valor com SharedPreferences.

Bancos de dados

O Android é totalmente compatível com bancos de dados SQLite. Qualquer banco de dados criado por você só é acessível ao seu aplicativo. No entanto, em vez de usar APIs do SQLite diretamente, recomendamos que você crie e interaja com seus bancos de dados com a biblioteca de persistência Room.

A biblioteca Room fornece uma camada de abstração de mapeamento de objetos que permite o acesso fácil ao banco de dados, aproveitando todo a eficiência do SQLite.

Embora você ainda possa salvar dados diretamente com o SQLite, as APIs do SQLite têm um nível razoavelmente baixo e exigem muito tempo e trabalho para serem usadas. Por exemplo:

  • Não há verificação em tempo de compilação de consultas SQL brutas.
  • Com a mudança do seu esquema, você precisa atualizar as consultas SQL afetadas manualmente. Esse processo pode ser demorado e propenso a erros.
  • Você precisa escrever muito código clichê para conversão entre consultas SQL e objetos de dados Java.

A biblioteca de persistência Room gerencia isso para você, fornecendo uma camada de abstração sobre o SQLite.

Para aplicativos de exemplo que demonstram como usar a Room, veja o seguinte no GitHub:

Depuração de bancos de dados

O Android SDK contém uma ferramenta de banco de dados sqlite3 que permite procurar pelo conteúdo de tabelas e executar comandos do SQL e outras funções úteis em bancos de dados SQLite. Para saber mais, consulte a documentação adb.

Recursos adicionais

Para mais informações sobre armazenamento de dados, consulte os seguintes recursos.

Codelabs