¿Cuáles son mis opciones para almacenar datos cuando uso React Native? (iOS y Android)

Todavía soy nuevo en el mundo React Native, y generalmente también en el mundo móvil / nativo, y encuentro que la documentación es un poco escasa en lo que respecta a la persistencia de los datos.

¿Cuáles son mis opciones para almacenar datos en React Native y las implicaciones de cada tipo? Por ejemplo, veo que hay almacenamiento local y almacenamiento asíncrono, pero también veo cosas como Realm, y estoy confundido de cómo todo esto funcionaría con una base de datos externa.

Yo específicamente quiero saber:

  • ¿Cuáles son las diferentes opciones para la persistencia de datos?
  • Para cada uno, ¿cuáles son los límites de esa persistencia (es decir, cuándo los datos ya no están disponibles)? Por ejemplo: al cerrar la aplicación, reiniciar el teléfono, etc.
  • Para cada uno, ¿hay diferencias (aparte de la configuración general) entre la implementación en iOS vs Android?
  • ¿Cómo se comparan las opciones para acceder a los datos fuera de línea? (¿o cómo se maneja normalmente el acceso sin conexión?)
  • ¿Hay alguna otra consideración que deba tener en cuenta?

¡Gracias por tu ayuda!

    Esto es lo que aprendí cuando determiné la mejor manera de avanzar con algunos de mis proyectos de aplicaciones actuales.

    Almacenamiento asíncrono (“integrado” para reactjsr nativo)

    Yo uso AsyncStorage para una aplicación en producción. El almacenamiento permanece local en el dispositivo, no está encriptado (como se menciona en otra respuesta), desaparece si elimina la aplicación, pero debe guardarse como parte de las copias de seguridad de su dispositivo y persistir durante las actualizaciones (tanto actualizaciones nativas como TestFlight y actualizaciones de código mediante CodePush )

    Conclusión: almacenamiento local; usted proporciona su propia solución de sincronización / copia de seguridad.

    SQLite

    Otros proyectos en los que he trabajado han utilizado sqlite3 para el almacenamiento de aplicaciones. Esto le brinda una experiencia similar a SQL, con bases de datos comprimibles que también se pueden transmitir hacia y desde el dispositivo. No he tenido experiencia en sincronizarlos con un back-end, pero imagino que existen varias bibliotecas. Hay bibliotecas de RN para conectarse a SQLite.

    Los datos se almacenan en su formato de base de datos tradicional con bases de datos, tablas, claves, índices, etc. todos guardados en el disco en un formato binario. El acceso directo a los datos está disponible a través de la línea de comandos o aplicaciones que tienen controladores SQLite.

    Conclusión: almacenamiento local; usted proporciona la sincronización y la copia de seguridad.

    Firebase

    Firebase ofrece, entre otras cosas, una base de datos no SQL en tiempo real junto con una tienda de documentos JSON (como MongoDB) destinada a mantener sincronizados de 1 a n clientes. Los documentos hablan sobre la persistencia fuera de línea, pero solo para el código nativo (Swift / Obj-C, Java). La opción de JavaScript de Google (“Web”) que utiliza React Native no proporciona una opción de almacenamiento en caché (consulte la actualización 2/18 a continuación). La biblioteca está escrita con la suposición de que un navegador web se va a conectar, por lo que habrá una conexión semipersistente. Probablemente podría escribir un mecanismo de almacenamiento en caché local para complementar las llamadas de almacenamiento de Firebase, o podría escribir un puente entre las bibliotecas nativas y Reaccionar nativo.

    [Actualización 2/2018] Desde entonces, encontré React Native Firebase, que proporciona una interfaz de JavaScript compatible con las bibliotecas nativas iOS y Android (haciendo lo que Google probablemente podría / debería haber hecho), ofreciéndole todas las ventajas de las bibliotecas nativas con la bonificación del soporte React Native. Con la introducción de Google de una tienda de documentos JSON junto a la base de datos en tiempo real, le estoy dando a Firebase un buen segundo vistazo para algunas aplicaciones en tiempo real que planeo construir.

    La base de datos en tiempo real se almacena como un árbol similar a JSON que puede editar en el sitio web e importar / exportar de forma sencilla.

    Conclusión: con reaction-native-firebase, RN obtiene los mismos beneficios que Swift y Java. [/ update] Escala bien para dispositivos conectados a la red. Bajo costo por baja utilización. Se combina muy bien con otras ofertas de la nube de Google. Datos fácilmente visibles y editables desde su interfaz.

    Reino

    También una tienda de objetos en tiempo real con sincronización de red automática. Se promocionan como “el dispositivo primero” y el video de demostración muestra cómo los dispositivos manejan la conectividad de red esporádica o con pérdida.

    Ofrecen una versión gratuita de la tienda de objetos que aloja en sus propios servidores o en una solución en la nube como AWS o Azure. También puede crear tiendas en memoria que no persisten con el dispositivo, tiendas solo para dispositivos que no se sincronizan con el servidor, tiendas de solo lectura y la opción de lectura y escritura para la sincronización en uno o más dispositivos. Tienen opciones profesionales y empresariales que cuestan más por adelantado por mes que Firebase.

    A diferencia de Firebase, todas las capacidades de Realm se admiten en React Native y Xamarin, al igual que en las aplicaciones Swift / ObjC / Java (nativas).

    Sus datos están vinculados a objetos en su código. Debido a que son objetos definidos, usted tiene un esquema y el control de versiones es imprescindible para la cordura del código. El acceso directo está disponible a través de las herramientas GUI que proporciona Realm. Los archivos de datos en el dispositivo son compatibles multiplataforma.

    Conclusión: dispositivo primero, sincronización opcional con planes gratuitos y pagos. Todas las funciones compatibles con React Native. La escala horizontal es más costosa que Firebase.

    iCloud

    Honestamente, no he jugado mucho con esto, pero lo haré en el futuro cercano.

    Si tiene una aplicación nativa que usa CloudKit, puede usar CloudKit JS para conectarse a los contenedores de su aplicación desde una aplicación web (o, en nuestro caso, React Native). En este escenario, probablemente tenga una aplicación nativa de iOS y una aplicación React Native de Android.

    Al igual que Realm, almacena los datos localmente y los sincroniza con iCloud siempre que sea posible. Hay tiendas públicas para su aplicación y tiendas privadas para cada cliente. Los clientes incluso pueden elegir compartir algunas de sus tiendas u objetos con otros usuarios.

    No sé cuán fácil es acceder a los datos sin procesar; los esquemas se pueden configurar en el sitio de Apple.

    Conclusión: ideal para aplicaciones dirigidas a Apple.

    Couchbase

    Gran nombre, muchas grandes compañías detrás. Hay una Edición de la Comunidad y una Edición Enterprise con los costos de soporte estándar.

    Tienen un tutorial en su sitio para conectar cosas a React Native. Tampoco he dedicado mucho tiempo a esto, pero parece ser una alternativa viable a Realm en términos de funcionalidad. No sé cuán fácil es acceder a sus datos fuera de su aplicación o de cualquier API que construya.

    [Editar: se encontró un enlace más antiguo que habla sobre Couchbase y CouchDB, y CouchDB puede ser otra opción a considerar. Los dos son productos históricamente relacionados pero actualmente completamente diferentes. Ver esta comparación .]

    Conclusión: Parece tener capacidades similares a Realm. Puede ser solo dispositivo o sincronizado. Necesito probarlo.

    MongoDB

    Estoy usando este lado del servidor para una parte de la aplicación que usa AsyncStorage localmente. Me gusta que todo esté almacenado como objetos JSON, lo que hace que la transmisión a los dispositivos cliente sea muy sencilla. En mi caso de uso, se usa como caché entre un proveedor de información de guía de TV y mis dispositivos cliente.

    No existe una estructura rígida para los datos, como un esquema, por lo que cada objeto se almacena como un “documento” que se puede buscar fácilmente, filtrar, etc. Los objetos JSON similares podrían tener atributos adicionales u otros objetos secundarios, lo que permite un mucha flexibilidad en la forma de estructurar sus objetos / datos.

    No he probado ninguna característica de sincronización del servidor con el servidor, ni la he utilizado incrustada. El código nativo de React para MongoDB existe.

    Conclusión: solución NoSQL local única, ninguna opción de sincronización obvia como Realm o Firebase.


    [Editar] He pasado un tiempo con Realm desde que originalmente escribí esto. Me gusta cómo no tengo que escribir una API para sincronizar los datos entre la aplicación y el servidor, de forma similar a Firebase. Las funciones sin servidor también parecen ser realmente útiles con estas dos, limitando la cantidad de código de back-end que tengo que escribir.

    Me encanta la flexibilidad de la tienda de datos MongoDB, por lo que se está convirtiendo en mi elección para el lado del servidor de aplicaciones basadas en la web y otras aplicaciones requeridas para la conexión.

    Encontré RESTHeart , que crea una API RESTful muy simple y escalable para MongoDB. No debería ser demasiado difícil construir un componente React (Native) que lea y escriba objetos JSON en RESTHeart, que a su vez los pasa a / desde MongoDB.


    [Editar] Agregué información sobre cómo se almacenan los datos. A veces es importante saber cuánto trabajo puede hacer durante el desarrollo y las pruebas si tiene que retocar y probar los datos.

    Rápido y sucio: solo use Redux + react-redux + redux- persist + AsyncStorage para react-native.

    Se adapta casi perfectamente al mundo nativo de reactjsr y funciona como un encanto para Android y iOS. Además, hay una comunidad sólida a su alrededor y mucha información.

    Para un ejemplo de trabajo, vea la F8App de Facebook.

    ¿Cuáles son las diferentes opciones para la persistencia de datos?

    Con reactjsr nativo, es probable que desee usar redux y redux-persist. Puede usar múltiples motores de almacenamiento. AsyncStorage y redux-persist-filesystem-storage son las opciones para RN.

    Hay otras opciones como Firebase o Realm, pero nunca las utilicé en un proyecto de RN.

    Para cada uno, ¿cuáles son los límites de esa persistencia (es decir, cuándo los datos ya no están disponibles)? Por ejemplo: al cerrar la aplicación, reiniciar el teléfono, etc.

    Al usar redux + redux-persist puedes definir lo que persiste y lo que no. Cuando no persiste, los datos existen mientras la aplicación se está ejecutando. Cuando persiste, los datos persisten entre las ejecuciones de la aplicación (cerrar, abrir, reiniciar el teléfono, etc.).

    AsyncStorage tiene un límite predeterminado de 6 MB en Android. Es posible configurar un límite más grande (en código Java) o utilizar redux-persist-filesystem-storage como motor de almacenamiento para Android.

    Para cada uno, ¿hay diferencias (aparte de la configuración general) entre la implementación en iOS vs Android?

    Al usar redux + redux-persist + AsyncStorage, la configuración es exactamente la misma en Android e iOS.

    ¿Cómo se comparan las opciones para acceder a los datos fuera de línea? (¿o cómo se maneja normalmente el acceso sin conexión?)

    Con el uso de redux, el acceso offiline es casi automático gracias a sus piezas de diseño (creadores de acción y reductores).

    Todos los datos que ha buscado y almacenado están disponibles, puede almacenar fácilmente datos adicionales para indicar el estado (recuperación, éxito, error) y la hora en que fue recuperado. Normalmente, solicitar una búsqueda no invalida los datos más antiguos y sus componentes solo se actualizan cuando se reciben nuevos datos.

    Lo mismo aplica en la otra dirección. Puede almacenar datos que está enviando al servidor y que aún están pendientes y manejarlos en consecuencia.

    ¿Hay alguna otra consideración que deba tener en cuenta?

    React promueve una forma reactiva de crear aplicaciones y Redux se adapta muy bien. Debes probarlo antes de usar una opción que usarías en tu aplicación habitual de Android o iOS. Además, encontrará muchos más documentos y ayuda para ellos.

    La gente de arriba muestra las notas correctas para el almacenamiento, aunque si también necesita considerar los datos PII que deben almacenarse, también puede esconderse en el llavero usando algo como https://github.com/oblador/react-native-keychain ya que ASyncStorage no está encriptado. Se puede aplicar como parte de la configuración persistir en algo como redux-persist.