Descripción general del almacenamiento de archivos y datos

Android ofrece diferentes opciones para que guardes los datos de tu aplicación. La solución que elijas dependerá de tus necesidades específicas; por ejemplo, cuánto espacio requieren tus datos, qué tipo de información debes guardar y si los datos deben ser privados o estar disponibles para el usuario y otras aplicaciones.

Esta página presenta las diferentes opciones de almacenamiento de datos disponibles en Android:

  • Almacenamiento interno: Sirve para almacenar archivos privados de aplicaciones en el sistema del dispositivo.
  • Almacenamiento externo: Sirve para almacenar archivos en un sistema externo compartido. Se usa principalmente para archivos que comparte el usuario, como fotos.
  • Preferencias compartidas: Sirve para almacenar datos privados de primitivas en pares clave-valor.
  • Base de datos: Sirve para almacenar datos estructurados en una base de datos privada.

A excepción de algunos tipos de archivos de almacenamiento externo, todas estas opciones están destinadas al uso privado de la aplicación (datos privados) que otras apps no pueden utilizar sin los permisos correspondientes. Si deseas compartir archivos con otras aplicaciones, debes utilizar la API de FileProvider. Para obtener más información, lee Cómo compartir archivos.

Si quieres exponer los datos de tu aplicación a otras aplicaciones, puedes usar un ContentProvider. Los proveedores de contenido te ofrecen control total sobre el acceso de lectura/escritura disponible para otras aplicaciones, independientemente del medio de almacenamiento que hayas elegido para los datos (aunque, normalmente, se trata de una base de datos). Para obtener más información, lee Proveedores de contenido.

Almacenamiento interno

De forma predeterminada, los archivos que se guardan en el almacenamiento interno son privados para tu aplicación, y otras aplicaciones no pueden tener acceso a ellos (tampoco el usuario, salvo que tenga acceso de administrador). Esto hace que el almacenamiento interno sea un buen lugar para guardar datos de aplicaciones internas a los que el usuario no necesita acceder directamente. El sistema proporciona un directorio privado en el sistema de archivos para cada aplicación. En ese directorio, puedes organizar cualquier archivo que necesite tu aplicación.

Cuando el usuario desinstala tu aplicación, se quitan los archivos guardados en el almacenamiento interno. Debido a este comportamiento, no debes utilizar el almacenamiento interno para guardar ningún contenido que el usuario espere que persista independientemente de tu aplicación. Por ejemplo, si tu aplicación permite tomar fotos, el usuario esperará poder acceder a ellas incluso después de desinstalar la aplicación. Por lo tanto, debes utilizar la API de MediaStore para guardar esos tipos de archivos en la colección de contenido multimedia correspondiente.

Para obtener más información, lee cómo guardar un archivo en el almacenamiento interno y cómo utilizar MediaStore para reproducir música basada en una consulta de búsqueda.

Archivos en la caché interna

Si deseas conservar algunos datos temporalmente, en lugar de almacenarlos de forma permanente, deberías utilizar el directorio especial de caché para guardarlos. Cada aplicación tiene un directorio de caché privado específico para este tipo de archivos. Cuando el dispositivo tenga poco espacio de almacenamiento interno, Android podrá quitar esos archivos de caché para recuperar espacio. Sin embargo, no debes confiar en que el sistema borrará estos archivos. Encárgate de controlar los archivos de caché y de mantenerlos dentro de un límite de espacio razonable, como 1 MB. Cuando el usuario desinstala tu aplicación, se quitan estos archivos.

Para obtener más información, consulta cómo escribir un archivo de caché.

Almacenamiento externo

Todos los dispositivos Android admiten un espacio de "almacenamiento externo" compartido que se puede utilizar para guardar archivos. Este espacio se denomina externo porque no está garantizado que sea accesible: es un espacio de almacenamiento que los usuarios pueden conectar a una computadora como dispositivo de almacenamiento externo, e incluso puede extraerse fácilmente (como una tarjeta SD). Cualquier usuario puede leer los archivos guardados en el almacenamiento externo, así como modificarlos, cuando habilita el almacenamiento masivo de USB para transferir archivos a una computadora.

Por lo tanto, antes de intentar acceder a un archivo de almacenamiento externo de tu aplicación, comprueba la disponibilidad de los directorios de almacenamiento externo, así como de los archivos a los que intentas acceder.

La mayoría de las veces, debes utilizar almacenamiento externo para conservar los datos del usuario a los que deben acceder otras aplicaciones, como las fotos tomadas o los archivos descargados, incluso si el usuario desinstala tu aplicación. El sistema proporciona directorios públicos estándar para este tipo de archivos, por lo que el usuario tiene una ubicación para sus fotos, sus tonos de llamada, su música, etc.

También puedes guardar archivos en el almacenamiento externo de un directorio específico de la aplicación, que el sistema borrará cuando el usuario desinstale la aplicación. Esta podría ser una alternativa útil al almacenamiento interno si necesitas más espacio, pero no se garantiza que se pueda acceder a los archivos guardados aquí, ya que el usuario podría quitar la tarjeta SD de almacenamiento. Además, los archivos siguen siendo legibles para todos; solo se guardan en una ubicación que no se comparte con otras aplicaciones.

Para obtener más información, lee cómo guardar un archivo en el almacenamiento externo.

Preferencias compartidas

Si tu aplicación no necesita almacenar muchos datos ni requiere una estructura, deberías utilizar SharedPreferences. La API de SharedPreferences te permite leer y escribir pares clave-valor persistentes de tipos de datos de primitivas: booleanos, floats, ints, longs y strings.

Los pares clave-valor se escriben en archivos XML que persisten en todas las sesiones de usuario, incluso si finaliza el proceso de tu app. Puedes especificar manualmente un nombre para el archivo o utilizar ficheros por actividad para guardar tus datos.

El nombre de la API "preferencias compartidas" es un poco engañoso porque la API no se usa estrictamente para guardar "preferencias del usuario", como un tono de llamada. Puedes usar SharedPreferences para guardar cualquier tipo de dato, como la puntuación de un juego. Sin embargo, si realmente deseas guardar las preferencias del usuario para tu aplicación, entonces debes leer cómo crear una IU de configuración, la cual utiliza el Preference Library de AndroidX para crear una pantalla de configuración y hacer que la configuración del usuario persista automáticamente.

Para aprender a almacenar cualquier tipo de datos de un par clave-valor, lee Cómo guardar datos de clave-valor con SharedPreferences.

Base de datos

Android proporciona compatibilidad completa con bases de datos de SQLite. Cualquier base de datos que crees será accesible solo mediante tu aplicación. Sin embargo, en lugar de usar las API de SQLite directamente, te recomendamos que crees tus bases de datos e interactúes con ellas mediante la persistencia de biblioteca de Room.

La biblioteca de Room proporciona una capa de abstracción de mapeo de objetos que permite un acceso fluido a la base de datos mientras se aprovecha toda la potencia de SQLite.

Aunque todavía se pueden guardar datos directamente con SQLite, las API de SQLite son de nivel bastante bajo y requieren mucho tiempo y esfuerzo para su uso. Por ejemplo:

  • No hay verificación en tiempo de compilación de las consultas SQL sin procesar.
  • A medida que cambia tu esquema, necesitas actualizar manualmente las consultas SQL afectadas. Este proceso puede llevar mucho tiempo y ser propenso a errores.
  • Necesitas escribir mucho código predeterminado para realizar conversiones entre consultas SQL y objetos de datos Java.

La biblioteca de persistencias de Room se encarga de estas cuestiones por ti al mismo tiempo que proporciona una capa de abstracción sobre SQLite.

Para ver ejemplos de aplicaciones que demuestran cómo usar Room, consulta lo siguiente en GitHub:

Depuración de la base de datos

El SDK de Android incluye una herramienta de base de datos sqlite3 que te permite explorar contenido de tablas, ejecutar comandos de SQL y llevar a cabo otras funciones útiles en las bases de datos de SQLite. Para obtener más información, consulta la documentación de adb.

Recursos adicionales

Para obtener más información sobre el almacenamiento de datos, consulta los siguientes recursos.

Codelabs