Mejores prácticas de la capa de datos
Un resumen condensado de las 25 mejores prácticas más importantes extraídas de cada página en esta sección.
Busca en todas las páginas de la documentación
Un resumen condensado de las 25 mejores prácticas más importantes extraídas de cada página en esta sección.
Asume que la red es poco confiable: Diseña las lecturas desde el caché local primero y escribe como reconciliación asincrónica - no como compuertas de fetch bloqueantes en cada pantalla.
Publica un contrato UX: Los usuarios siempre deben saber si los datos están en vivo, obsoletos, sincronizándose o no disponibles - acuerda la copia con el diseño antes de la implementación.
Usa NetInfo para la conectividad - no sondeos de fetch: @react-native-community/netinfo refleja la accesibilidad continua; un ping HTTP de una sola vez en el montaje miente en portales cautivos.
Oculta el banner offline durante la accesibilidad desconocida: isInternetReachable === null en el inicio en frío no está offline - espera a un falso definitivo antes de alertar.
Conecta onlineManager a NetInfo en el bootstrap: TanStack Query debe pausar reintentos offline - reintentos sin límite en modo avión agotan la batería y envían spam a los registros.
Conecta focusManager a AppState: Las políticas de refetch deben respetar el primer plano/fondo móvil - no suposiciones de window.focus de escritorio.
Stale-while-revalidate de forma predeterminada: Muestra datos de Query en caché con una etiqueta dataUpdatedAt - spinners de pantalla completa solo cuando isPending && !data.
Distingue offline de errores del servidor: Títulos diferentes, rutas de reintento y análisis - un 500 con datos en caché no es lo mismo que modo avión.
Acepta escrituras locales offline: Encola mutaciones con idempotencyKey - los usuarios no deben perder envíos de formularios en un túnel.
Elige almacenamiento según la forma de datos: AsyncStorage para JSON pequeño; SQLite para filas relacionales; MMKV para lecturas de ruta en caliente sincrónicas - no un almacén para todo.
Versionea cada esquema persistido: app:storage:meta:v1 para AsyncStorage, PRAGMA user_version para SQLite, meta:schemaVersion para MMKV - envía migraciones antes de que nuevas formas lleguen a producción.
Ejecuta migraciones antes del renderizado de la primera pantalla: Compuerta de arranque en root _layout - las pantallas nunca deben leer claves o tablas sin migrar.
Recupera de la corrupción sin pantalla blanca: safeParse + reinicio de clave limitado - pone en cuarentena outbox antes de clear() en aplicaciones de campo.
Espacio de nombres de claves de almacenamiento por dominio: sync:outbox:v1, user:preferences:v1 - evita limpiezas accidentales entre características y facilita el cierre de sesión de alcance.
Habilita WAL de SQLite y claves externas al crear: PRAGMA journal_mode = WAL y foreign_keys = ON en cada nueva base de datos - rendimiento e integridad referencial desde el primer día.
Usa instrucciones preparadas o plantillas db.sql: Nunca concatenes entrada del usuario en execAsync - la inyección SQL se aplica en el dispositivo también.
Usa withExclusiveTransactionAsync para paquetes de multi-escritura: El withTransactionAsync predeterminado puede intercalar consultas concurrentes - alcance exclusivo para inspecciones guardan.
Agrega synced, updated_at y marcas de tumba a tablas de sincronización: Las eliminaciones deben replicarse - banderas de eliminación suave vencen la eliminación dura para sincronización offline.
Por defecto a la reconciliación autorizada por el servidor: Los datos de dinero, inventario y cumplimiento no deben usar el naive last-write-wins - documenta ediciones descartadas en UX.
Empareja LWW con marcas de tiempo del servidor: El Date.now() del cliente solo pierde ediciones offline concurrentes - reemplaza updated_at con el valor del servidor en cada ack.
Implementa UI optimista con reversión: TanStack Query onMutate instantáneas de caché previo; onError lo restaura - banderas pending por fila vencen spinners globales.
Persiste mutaciones fallidas - UI optimista sin cola pierde creaciones: AsyncStorage o outbox de SQLite se reproduce en la reconexión con la misma clave de idempotencia.
Registra sincronización en segundo plano en alcance global: TaskManager.defineTask antes de que React monte; registerTaskAsync después del login - vacía outbox en ventanas deferibles del SO.
Trata tareas en segundo plano como red de seguridad: El flush en primer plano en reconexión de NetInfo es primario - minimumInterval: 15 minutos no es entrega en tiempo real.
El cierre de sesión borra todas las capas: queryClient.clear(), claves de AsyncStorage de sesión, instancia de usuario de MMKV y tablas de usuario de SQLite - caché obsoleto es un defecto de seguridad.
TanStack Query + NetInfo + AsyncStorage (prefs/outbox) + expo-sqlite (datos relacionales offline). Agrega MMKV cuando la elaboración de perfiles demuestra que AsyncStorage está en la ruta en caliente. Agrega expo-background-task cuando las aplicaciones de campo necesitan flush diferido.
Cola de AsyncStorage para docenas de pequeños parches JSON. SQLite cuando el outbox hace referencia a filas relacionales, archivos adjuntos o miles de elementos pendientes - ver AsyncStorage Patterns y expo-sqlite.
Raramente para captura de campo de un solo dispositivo. Adopta cuando la edición simultánea de múltiples usuarios es un requisito de producto - ver Sync Strategies.
Query posee caché de estado del servidor y mutaciones optimistas. Esta sección posee durabilidad, sincronización y ciclo de vida del SO - lectura cruzada ../state-management/tanstack-query/tanstack-query.md.
Versiones de Stack: Esta página fue escrita para React 19.2.3, React Native 0.86.0 y Expo SDK 57 (
expo~57.0.4).
Revisado por Chris St. John·Última actualización: 19 jul 2026