Esto es lo que aprendí al determinar la mejor manera de avanzar con un par de mis proyectos de aplicaciones actuales.
Almacenamiento asíncrono ("incorporado" para reaccionar 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 persiste durante las actualizaciones (tanto las actualizaciones nativas como TestFlight y las actualizaciones de código a través de CodePush )
Conclusión: almacenamiento local; Usted proporciona su propia solución de sincronización / respaldo.
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 desde y hacia el dispositivo. No he tenido ninguna experiencia en sincronizarlos con un back-end, pero imagino que existen varias bibliotecas. Hay bibliotecas 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 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; proporciona la sincronización y la copia de seguridad.
Firebase
Firebase ofrece, entre otras cosas, una base de datos noSQL en tiempo real junto con un almacén de documentos JSON (como MongoDB) destinado a mantener sincronizados de 1 a n número de clientes. Los documentos hablan sobre la persistencia fuera de línea, pero solo para el código nativo (Swift / Obj-C, Java). La propia 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 el supuesto 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 React Native.
Actualización 2/2018
Desde entonces encontré React Native Firebase que proporciona una interfaz de JavaScript compatible con las bibliotecas nativas de iOS y Android (haciendo lo que Google probablemente podría / debió haber hecho), ofreciéndole todas las ventajas de las bibliotecas nativas con la ventaja de React Apoyo nativo Con la introducción de Google de un almacén de documentos JSON junto a la base de datos en tiempo real, le estoy dando a Firebase una buena segunda mirada 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 manera bastante simple.
Conclusión: Con react-native-firebase, RN obtiene los mismos beneficios que Swift y Java. [/ actualización] Escala bien para dispositivos conectados a la red. Bajo costo por baja utilización. Combina muy bien con otras ofertas en la nube de Google. Datos fácilmente visibles y editables desde su interfaz.
Reino
Actualización 4/2020
MongoDB ha adquirido Realm y está planeando combinarlo con MongoDB Stitch (discutido a continuación). Esto se ve muy emocionante .
También una tienda de objetos en tiempo real con sincronización de red automática. Se promocionan a sí mismos como "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 del almacén de objetos que aloja en sus propios servidores o en una solución en la nube como AWS o Azure. También puede crear almacenes en memoria que no persistan con el dispositivo, almacenes solo para dispositivos que no se sincronizan con el servidor, almacenes de servidor de solo lectura y la opción completa de lectura y escritura para la sincronización en uno o más dispositivos. Tienen opciones profesionales y empresariales que cuestan más por mes que Firebase.
A diferencia de Firebase, todas las capacidades de Realm son compatibles con React Native y Xamarin, al igual que las aplicaciones Swift / ObjC / Java (nativas).
Sus datos están vinculados a objetos en su código. Debido a que son objetos definidos, 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 Realm proporciona. Los archivos de datos en el dispositivo son compatibles con todas las plataformas.
Conclusión: dispositivo primero, sincronización opcional con planes gratuitos y pagos. Todas las funciones compatibles con React Native. Escalado horizontal más costoso que Firebase.
iCloud
Sinceramente, no he jugado mucho con este, 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 tendría una aplicación iOS nativa y una aplicación React Native Android.
Al igual que Realm, almacena datos localmente y los sincroniza con iCloud cuando es 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é lo fácil que 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 de él. Hay una edición comunitaria y una edición empresarial con los costos de soporte estándar.
Tienen un tutorial en su sitio para conectar cosas a React Native. Tampoco he pasado mucho tiempo con este, pero parece ser una alternativa viable a Realm en términos de funcionalidad. No sé lo fácil que es acceder a sus datos fuera de su aplicación o de cualquier API que cree.
[Editar: Encontré un enlace anterior que habla sobre Couchbase y CouchDB, y CouchDB puede ser otra opción a tener en cuenta. Los dos están históricamente relacionados, pero actualmente son productos completamente diferentes. Ver esta comparación .]
Conclusión: parece tener capacidades similares a Realm. Puede ser solo dispositivo o sincronizado. Necesito probarlo.
MongoDB
Actualización 4/2020
Mongo adquirió Realm y planea combinar MongoDB Stitch (discutido más abajo) con Realm (discutido arriba).
Estoy usando este lado del servidor para una parte de la aplicación que usa AsyncStorage localmente. Me gusta que todo se almacene como objetos JSON, lo que hace que la transmisión a los dispositivos del cliente sea muy sencilla. En mi caso de uso, se usa como caché entre un proveedor de datos de guía de TV y mis dispositivos cliente.
Los datos no tienen una estructura rígida, como un esquema, por lo que cada objeto se almacena como un "documento" que se puede buscar, filtrar, etc. Mucha flexibilidad en cómo estructurar sus objetos / datos.
No he probado ninguna función de sincronización de cliente a servidor, ni la he usado integrada. React El código nativo para MongoDB existe.
Conclusión: solución NoSQL solo local, sin opción de sincronización obvia como Realm o Firebase.
Actualización 2/2019
MongoDB tiene un "producto" (o servicio) llamado Stitch. Dado que los clientes (en el sentido de los navegadores web y los teléfonos) no deberían hablar directamente con MongoDB (esto se hace mediante un código en su servidor), crearon un front-end sin servidor con el que sus aplicaciones pueden interactuar, si decide usar su solución alojada (Atlas). Su documentación hace parecer que existe una posible opción de sincronización.
Este informe de diciembre de 2018 analiza el uso de React Native, Stitch y MongoDB en una aplicación de muestra, con otras muestras vinculadas en el documento ( https://www.mongodb.com/blog/post/building-ios-and-android-apps -with-the-mongodb-stitch-react-native-sdk ).
Twilio Sync
Otra opción NoSQL para sincronización es la sincronización de Twilio. Desde su sitio: "Sync le permite administrar el estado en cualquier número de dispositivos en tiempo real a escala sin tener que manejar ninguna infraestructura de back-end".
Vi esto como una alternativa a Firebase para uno de los proyectos antes mencionados, especialmente después de hablar con ambos equipos. También me gustan sus otras herramientas de comunicación, y las he usado para enviar actualizaciones de mensajes de texto desde una aplicación web simple.
[Editar] He pasado algún tiempo con Realm desde que escribí esto originalmente. Me gusta cómo no tengo que escribir una API para sincronizar los datos entre la aplicación y el servidor, similar a Firebase. Las funciones sin servidor también parecen ser realmente útiles con estas dos, limitando la cantidad de código de fondo que tengo que escribir.
Me encanta la flexibilidad del almacén de datos MongoDB, por lo que se está convirtiendo en mi elección para el lado del servidor de aplicaciones basadas en web y otras aplicaciones que requieren 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 realizar durante el desarrollo y las pruebas si tiene que ajustar y probar los datos.
Ediciones 2/2019 Experimenté con varias de estas opciones al diseñar un proyecto de alta concurrencia el año pasado (2018). Algunos de ellos mencionan límites de concurrencia rígidos y blandos en su documentación (Firebase tenía uno duro con 10,000 conexiones, creo, mientras que Twilio era un límite blando que podría ser superado, según las discusiones con ambos equipos en AltConf).
Si está diseñando una aplicación para decenas a cientos de miles de usuarios, prepárese para escalar el backend de datos en consecuencia.