Almacenamiento de datos en el desarrollo móvil: qué es, métodos y cómo funciona

Autor: IT Sectr Publicado: 2026-03-08 Tiempo de lectura: 9 min

El almacenamiento de datos es una de las tareas clave de una aplicación móvil, que afecta al rendimiento, la seguridad y la experiencia del usuario. En este artículo analizaremos SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore y Keychain, así como los formatos de serialización (JSON, Protobuf) y las bibliotecas (Gson, Moshi, kotlinx.serialization). Esta guía ayudará a los desarrolladores principiantes a elegir la solución de almacenamiento de datos adecuada. Más información en la guía oficial de Android sobre almacenamiento de datos.

Puntos clave

  • Room (Android) y Core Data (iOS) son los ORM oficiales para trabajar con bases de datos relacionales en cada plataforma
  • SharedPreferences (Android) está siendo reemplazado por DataStore — un almacenamiento asíncrono y seguro de pares clave-valor
  • Para el almacenamiento seguro de tokens se utilizan Keystore (Android) y Keychain (iOS) con protección hardware
  • Firebase Firestore es una base de datos NoSQL con sincronización en tiempo real y modo offline
  • Serialización — conversión de objetos a JSON/Protobuf mediante Gson, Moshi, kotlinx.serialization

Bases de datos locales: SQLite, Room, Core Data, Realm

Para almacenar datos estructurados con relaciones entre entidades se utilizan bases de datos relacionales.

SQLite

SQLite es una base de datos relacional embebida que funciona en cualquier plataforma móvil. No requiere un servidor independiente y los datos se almacenan en un solo archivo. SQLite es la base de Room (Android) y opcionalmente de Core Data (iOS). Bibliotecas: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).

Room (Android)

Room es la biblioteca oficial de Android Architecture Components para trabajar con SQLite. Proporciona una capa ORM: Entity (tabla), DAO (consultas), Database (punto de entrada). Room verifica las consultas SQL en tiempo de compilación, admite corrutinas y Flow, y migra automáticamente el esquema.

kotlin
@Entity
data class User(
    @PrimaryKey val id: Int,
    val name: String,
    val email: String
)

@Dao
interface UserDao {
    @Query("SELECT * FROM user WHERE id = :id")
    suspend fun getUser(id: Int): User?
}

Core Data (iOS)

Core Data es el framework de Apple para gestionar un grafo de objetos. No es una base de datos pura, sino una capa de persistencia sobre SQLite, XML o almacenamiento binario. Core Data gestiona objetos (NSManagedObject), relaciones, versionado de esquemas, deshacer/rehacer y trabajo con múltiples hilos a través de NSManagedObjectContext.

Realm

Realm es una alternativa a SQLite, diseñada como una base de datos móvil de alto rendimiento. Realm es más rápida que SQLite en lectura y escritura, admite notificaciones reactivas (Live Objects), cifrado en tiempo real y multiplataforma (Android, iOS, Flutter, React Native). Desventajas: mayor tamaño de APK/IPA y mayor consumo de memoria.

Almacenamiento clave-valor y configuración

Para almacenar pequeñas cantidades de datos (configuración, tokens, caché) se utilizan almacenes simples de pares clave-valor.

SharedPreferences (Android)

SharedPreferences es un almacén heredado de pares clave-valor en Android. Desventajas: acceso síncrono (bloquea la UI al leer), falta de tipado, riesgo de ANR al cargar archivos grandes. NO recomendado para proyectos nuevos.

DataStore (Jetpack Android)

DataStore es el reemplazo moderno de SharedPreferences de Google. Funciona de forma asíncrona mediante Kotlin Coroutines y Flow, admite Preferences DataStore (clave-valor) y Proto DataStore (datos tipificados mediante Protobuf). DataStore es seguro para el hilo de UI y admite transacciones.

NSUserDefaults (iOS)

UserDefaults es el almacenamiento estándar para pequeñas configuraciones en iOS. Admite tipos primitivos, cadenas, fechas y Data. UserDefaults es síncrono, por lo que no es adecuado para grandes volúmenes de datos. El registro de valores mediante register(defaults:) establece los valores por defecto.

Bases de datos en la nube: Firebase Firestore y Realtime DB

Para almacenar datos en aplicaciones que requieren sincronización entre dispositivos se utilizan bases de datos en la nube de Firebase.

Cloud Firestore

Firebase Firestore es una base de datos documental NoSQL con suscripciones en tiempo real, escalado automático, consultas potentes y modo offline integrado. Los datos se organizan en colecciones y documentos (estructuras similares a JSON). Firestore admite transacciones y operaciones por lotes. Ideal para chats, feeds y aplicaciones sociales.

Firebase Realtime Database

Firebase Realtime Database es una base de datos NoSQL más antigua de Firebase que almacena datos como un único árbol JSON. Más simple que Firestore, pero menos flexible en consultas y escalado. Recomendada para aplicaciones simples en tiempo real (estado en línea, chats simples).

Característica Cloud Firestore Firebase Realtime DB
Modelo de datosColecciones → DocumentosÁrbol JSON
ConsultasComplejas (filtrado, ordenación, límites)Simples (por clave)
EscaladoAutomáticoFragmentación manual
Modo offlineSí (caché persistente)
PrecioPor operaciones de lectura/escrituraPor tráfico + almacenamiento

Almacenamiento seguro: Keystore, Keychain y EncryptedSharedPreferences

El almacenamiento de tokens, contraseñas y claves de cifrado requiere almacenes protegidos especiales.

Android Keystore

Android Keystore es un almacén de sistema para claves criptográficas. Las claves se almacenan en un entorno hardware (TEE — Trusted Execution Environment), inaccesible para aplicaciones y el sistema operativo. Admite generación de claves, cifrado y firma. Con Android 9+ incluye StrongBox Keymaster (chip dedicado).

iOS Keychain

Keychain Services es un almacén seguro de iOS para contraseñas, claves y certificados. Los datos se cifran utilizando el Secure Enclave hardware. Keychain admite niveles de accesibilidad: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.

EncryptedSharedPreferences (Android)

EncryptedSharedPreferences es un envoltorio sobre SharedPreferences con cifrado de claves y valores mediante AES256-GCM y HKDF. Implementado en la biblioteca AndroidX Security. Recomendado para almacenar tokens y configuraciones confidenciales.

En IT Sectr utilizamos Android Keystore + EncryptedSharedPreferences para almacenar tokens de actualización y claves biométricas. En iOS utilizamos Keychain con el nivel kSecAttrAccessibleWhenUnlockedThisDeviceOnly para máxima seguridad.

Almacenamiento de archivos: Internal, External, Cache Directory

Para el almacenamiento de archivos (imágenes, vídeos, documentos), las plataformas móviles ofrecen varios tipos de almacenamiento.

Android Storage

Android distingue entre Internal Storage (/data/data/paquete/ — almacenamiento privado) y External Storage (tarjeta SD o partición emulada). Cache Directory es un almacenamiento temporal que el sistema puede limpiar. Scoped Storage (Android 10+) restringe el acceso a External Storage — las aplicaciones solo ven sus propios archivos o archivos a través de MediaStore/SAF.

iOS Storage

iOS proporciona Documents Directory (copia de seguridad de iCloud, datos persistentes), Library/Caches (archivos temporales, no se respaldan) y Tmp Directory (temporales, pueden limpiarse). Use NSFileManager para trabajar con el sistema de archivos. iOS 11+ admite File Provider para archivos en la nube.

Serialización de datos: JSON, Protobuf y bibliotecas

La serialización convierte objetos en un formato para su transmisión o almacenamiento. La deserialización es el proceso inverso.

Formatos

JSON (JavaScript Object Notation) es el formato más popular: legible, flexible, compatible con todas las plataformas. XML es más estricto, se utiliza en sistemas heredados. Protobuf (Protocol Buffers) es un formato binario de Google: de 3 a 10 veces más compacto que JSON, se analiza más rápido y tiene un esquema estricto. Se utiliza para sistemas de alta carga y microservicios.

Bibliotecas Android

  • Gson (Google) — simple, flexible, pero lento. Funciona automáticamente con objetos Java/Kotlin
  • Moshi (Square) — más rápido que Gson, mejor soporte de Kotlin (propiedades no nulas, valores por defecto, clases selladas)
  • kotlinx.serialization — serialización nativa de Kotlin de JetBrains, funciona en tiempo de compilación, admite JSON, Protobuf, CBOR

Bibliotecas iOS

JSONSerialization es la API integrada para trabajar con JSON. Codable (Encodable/Decodable) es un protocolo moderno de Swift para la serialización automática a JSON, Property List y otros formatos.

swift
struct User: Codable {
    let id: Int
    let name: String
    let email: String
}
let user = User(id: 1, name: "Alice", email: "alice@example.com")
let encoder = JSONEncoder()
let jsonData = try encoder.encode(user)

Soluciones multiplataforma: Hive, ObjectBox, Drift

Para Flutter y React Native existen bibliotecas de almacenamiento eficientes propias.

Hive (Flutter)

Hive es un almacén clave-valor ligero y rápido para Flutter. No requiere código nativo (Dart puro), admite tipificación mediante TypeAdapter y funciona en isolates. Ideal para caché, configuraciones y pequeños volúmenes de datos.

ObjectBox

ObjectBox es una base de datos embebida de alto rendimiento para Flutter, Android e iOS. Es 10 veces más rápida que SQLite y utiliza una estructura de archivos plana para una sobrecarga mínima. Admite relaciones, consultas y suscripciones reactivas (ObjectBox Dart).

Drift (antes Moor)

Drift es una biblioteca SQLite reactiva para Flutter y Dart. Proporciona consultas tipificadas, migraciones, funciones DAO y soporte para Stream (actualizaciones reactivas). Drift es la opción principal para proyectos Flutter que requieren SQLite.

Preguntas frecuentes

¿Qué es mejor usar para el almacenamiento local de datos: Room o Core Data?

La elección depende de la plataforma: Room (Android) es la biblioteca oficial basada en SQLite con verificación de consultas en tiempo de compilación. Core Data (iOS) es el framework de Apple con un grafo de objetos. Para proyectos multiplataforma, Realm o SQLite mediante ORM son adecuados.

¿En qué se diferencia SharedPreferences de DataStore?

SharedPreferences es una implementación antigua con acceso síncrono y riesgo de ANR. DataStore (Jetpack) es un reemplazo moderno basado en Kotlin Coroutines y Flow, que admite asincronía, tipificación y protección contra errores.

¿Cómo almacenar de forma segura tokens y contraseñas en una aplicación móvil?

Android: EncryptedSharedPreferences o Android Keystore. iOS: Keychain Services con nivel de accesibilidad WhenUnlockedThisDeviceOnly. Para datos críticos, use Secure Enclave (iOS) y Keystore hardware (Android) con biometría.

¿Qué es Firebase Firestore y cuándo debería usarse?

Cloud Firestore es una base de datos NoSQL de Firebase con sincronización en tiempo real, modo offline y escalado automático. Es adecuada para chats, feeds de noticias y proyectos que necesitan sincronización entre dispositivos.

¿Qué ORM existen para Flutter y React Native?

Flutter: Hive (clave-valor rápido), Floor (ORM SQLite), Drift (Moor, SQLite reactivo), ObjectBox (BD embebida de alto rendimiento). React Native: Realm, WatermelonDB (carga diferida) y AsyncStorage (análogo a SharedPreferences).

Resumen

  • Room (Android) y Core Data (iOS) son las soluciones oficiales para bases de datos relacionales en cada plataforma
  • DataStore reemplaza a SharedPreferences para el almacenamiento asíncrono de configuraciones
  • Keystore / Keychain son obligatorios para el almacenamiento seguro de tokens y claves
  • Firebase Firestore es la mejor opción para la sincronización en tiempo real entre dispositivos
  • Kotlinx.serialization (Android) y Codable (iOS) son enfoques modernos de serialización
  • Para Flutter: Drift (SQLite), Hive (clave-valor), ObjectBox (alto rendimiento)
  • Realm es una alternativa multiplataforma a SQLite con notificaciones reactivas

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto