Si te has aventurado en el mundo del desarrollo móvil, sabrás que hay momentos en los que necesitas que tu aplicación recuerde ciertas cosas sin tener que montar toda una infraestructura de base de datos. Para esos casos, donde solo quieres guardar un par de datos sencillos, como el nombre del usuario o si ya ha pasado por la pantalla de bienvenida, las SharedPreferences son la herramienta ideal y la más rápida de implementar.
Básicamente, estamos hablando de un sistema que guarda la información en pares de clave y valor, lo que significa que es como tener una pequeña agenda donde buscas una etiqueta y obtienes un dato. Aunque es una solución muy práctica, hoy en día existen alternativas más modernas, por lo que es fundamental saber cuándo usarlas y cuándo es mejor dar el salto a opciones más robustas.
¿Qué son exactamente las SharedPreferences y cómo funcionan?
En esencia, las SharedPreferences son un mecanismo de almacenamiento local persistente. Esto implica que los datos no se borran al cerrar la app, ya que se escriben en el disco del dispositivo y no solo en la memoria volátil. En el caso específico de Android, esta información se guarda en un archivo XML, aunque si trabajas con Flutter, el framework hace la magia y abstrae esto para que funcione igual en iOS (usando UserDefaults) o en la web (con LocalStorage).
Es la opción perfecta para gestionar el estado de la sesión, flags de configuración o pequeños trozos de información que no requieran una estructura compleja. No obstante, hay que tener cuidado: como los datos se guardan en un XML sin cifrar, no debes guardar contraseñas ni llaves privadas aquí; para eso existen soluciones de almacenamiento seguro.
Cómo gestionar el acceso a los archivos de preferencias
Para empezar a trastear con los datos, primero necesitas acceder al archivo de preferencias. En Android, tienes varias rutas dependiendo de lo que busques: si necesitas manejar múltiples archivos identificados por nombre, el método
getSharedPreferences() es tu mejor aliado. Si solo necesitas un archivo único vinculado a una actividad concreta, puedes usar getPreferences().Un truco para no liarte con los nombres de los archivos es combinar el ID de tu aplicación con una clave específica, algo como «com.tuapp.settings». Además, es vital recordar que los modos de lectura y escritura global (como MODE_WORLD_READABLE) están obsoletos desde hace tiempo y pueden provocar que tu app explote con una SecurityException en versiones modernas de Android.
El proceso de escritura: guardar datos paso a paso
Para meter datos en el archivo, no puedes escribir directamente; necesitas un objeto Editor. Esto se consigue llamando al método
edit() sobre tu instancia de SharedPreferences. Una vez tienes el editor, usas métodos específicos según el tipo de dato: putInt() para enteros, putString() para texto, putBoolean() para valores lógicos y así sucesivamente.Aquí viene un punto clave: la elección entre apply() y commit(). Si quieres que los cambios se guarden de forma asíncrona y no bloqueen la interfaz de usuario, usa
apply(), que es lo más común. Si por el contrario necesitas saber inmediatamente si la escritura en disco tuvo éxito, usa commit(), aunque ten cuidado de no lanzarlo en el hilo principal para evitar que la app se congele.Recuperación de información y lectura de valores
Leer los datos es mucho más directo que escribirlos. Simplemente llamas a los métodos
getInt(), getString() o getBoolean() pasando la clave que definiste al guardar. Un detalle importantísimo es que estos métodos te permiten definir un valor predeterminado; así, si la clave no existe (porque es la primera vez que el usuario abre la app), el sistema te devolverá ese valor en lugar de dejarte colgado.En entornos como Flutter, recuerda que estas operaciones son asíncronas. Por eso, siempre verás el uso de
async y await al obtener la instancia con SharedPreferences.getInstance(), ya que leer del disco es una operación costosa para el sistema y no queremos que la fluidez de la app se resienta.Trucos avanzados: Guardar objetos complejos y JSON
Por defecto, SharedPreferences solo acepta tipos primitivos. Pero, ¿qué pasa si quieres guardar una clase Persona con nombre y edad? Aquí es donde entra en juego la serialización. La técnica más limpia es convertir tu objeto a una cadena JSON usando
json.encode() y guardarlo como un String normal.Para recuperarlo, simplemente lees el String y aplicas
json.decode() para reconstruir el objeto. Eso sí, no abuses de esto. Si te encuentras guardando listas enormes o estructuras muy profundas, es una señal clara de que SharedPreferences se te ha quedado pequeña y deberías migrar a una base de datos como Room para gestionar los datos de forma profesional.Alternativas modernas y buenas prácticas
Si estás empezando un proyecto desde cero, Google recomienda echar un vistazo a Jetpack DataStore. Esta es la evolución de SharedPreferences, basada en corrutinas y flujos de Kotlin, que soluciona muchos de los problemas de rendimiento y seguridad de la API antigua. No obstante, SharedPreferences sigue siendo imbatible en velocidad de implementación para proyectos pequeños.
Como regla de oro, mantén tus datos simples. Si necesitas cifrado, usa Secure Storage. Si necesitas relaciones entre datos, vete a una base de datos. Y sobre todo, recuerda validar siempre los nulos al recuperar información para evitar que tu aplicación se cierre inesperadamente. Comparte la guía para que más usuarios conozcan del tema.
Continúar leyendo...