Aqui está o que aprendi ao determinar a melhor maneira de avançar com alguns dos meus projetos de aplicativos atuais.
Armazenamento assíncrono ("interno" para reagir ao nativo)
Eu uso o AsyncStorage para um aplicativo em produção. O armazenamento permanece local no dispositivo, não é criptografado (como mencionado em outra resposta), desaparece se você excluir o aplicativo, mas deve ser salvo como parte dos backups do dispositivo e persistir durante as atualizações (ambas as atualizações nativas, ala TestFlight e atualizações de código via CodePush )
Conclusão: armazenamento local; você fornece sua própria solução de sincronização / backup.
SQLite
Outros projetos em que trabalhei usaram o sqlite3 para armazenamento de aplicativos. Isso proporciona uma experiência semelhante ao SQL, com bancos de dados compactáveis que também podem ser transmitidos de e para o dispositivo. Não tive experiência em sincronizá-los com um back-end, mas imagino que existem várias bibliotecas. Existem bibliotecas RN para conectar ao SQLite.
Os dados são armazenados no seu formato tradicional de banco de dados, com bancos de dados, tabelas, chaves, índices, etc. salvos no disco em formato binário. O acesso direto aos dados está disponível via linha de comando ou aplicativos que possuem drivers SQLite.
Conclusão: armazenamento local; você fornece a sincronização e o backup.
Firebase
O Firebase oferece, entre outras coisas, um banco de dados noSQL em tempo real, juntamente com um repositório de documentos JSON (como o MongoDB), destinado a manter de 1 a n número de clientes sincronizados. Os documentos falam sobre persistência offline, mas apenas para código nativo (Swift / Obj-C, Java). A opção JavaScript do Google ("Web"), usada pelo React Native, não fornece uma opção de armazenamento em cache (consulte a atualização 2/18 abaixo). A biblioteca é gravada com a suposição de que um navegador da Web se conectará e, portanto, haverá uma conexão semi-persistente. Provavelmente, você poderia escrever um mecanismo de cache local para complementar as chamadas de armazenamento do Firebase ou escrever uma ponte entre as bibliotecas nativas e o React Native.
Atualização 2/2018
Desde então, encontrei o React Native Firebase, que fornece uma interface JavaScript compatível para as bibliotecas iOS e Android nativas (fazendo o que o Google provavelmente poderia / deveria ter feito), oferecendo a você todos os benefícios das bibliotecas nativas com o bônus de React Suporte nativo. Com a introdução do Google de um repositório de documentos JSON ao lado do banco de dados em tempo real, estou dando ao Firebase uma boa segunda olhada em alguns aplicativos em tempo real que planejo criar.
O banco de dados em tempo real é armazenado como uma árvore semelhante a JSON que você pode editar no site e importar / exportar com bastante simplicidade.
Conclusão: Com o react-native-firebase, o RN obtém os mesmos benefícios que o Swift e o Java. [/ update] Escala bem para dispositivos conectados à rede. Baixo custo para baixa utilização. Combina bem com outras ofertas da nuvem do Google. Dados prontamente visíveis e editáveis a partir de sua interface.
Reino
Atualização 4/2020 O
MongoDB adquiriu o Realm e planeja combiná-lo com o MongoDB Stitch (discutido abaixo). Isso parece muito emocionante .
Também um armazenamento de objetos em tempo real com sincronização de rede automagica. Eles são considerados "dispositivos primeiro" e o vídeo de demonstração mostra como os dispositivos lidam com conectividade de rede esporádica ou com perdas.
Eles oferecem uma versão gratuita do armazenamento de objetos que você hospeda em seus próprios servidores ou em uma solução em nuvem como AWS ou Azure. Você também pode criar armazenamentos na memória que não persistem com o dispositivo, armazenamentos somente para dispositivos que não são sincronizados com o servidor, armazenamentos de servidores somente leitura e a opção de leitura e gravação completa para sincronização em um ou mais dispositivos. Eles têm opções profissionais e empresariais que custam mais adiantado por mês do que o Firebase.
Diferentemente do Firebase, todos os recursos do Realm são suportados no React Native e no Xamarin, assim como nos aplicativos Swift / ObjC / Java (nativo).
Seus dados estão vinculados a objetos no seu código. Por serem objetos definidos, você possui um esquema e o controle de versão é essencial para a integridade do código. O acesso direto está disponível através das ferramentas da GUI fornecidas pelo Realm. Os arquivos de dados no dispositivo são compatíveis com várias plataformas.
Conclusão: Primeiro dispositivo, sincronização opcional com planos gratuitos e pagos. Todos os recursos são suportados no React Native. Escala horizontal mais cara que o Firebase.
iCloud
Sinceramente, não brinquei muito com esse, mas vou fazê-lo em um futuro próximo.
Se você possui um aplicativo nativo que usa o CloudKit, pode usar o CloudKit JS para conectar-se aos contêineres do seu aplicativo a partir de um aplicativo Web (ou, no nosso caso, React Native). Nesse cenário, você provavelmente teria um aplicativo iOS nativo e um aplicativo React Native Android.
Como o Realm, ele armazena dados localmente e os sincroniza com o iCloud, quando possível. Existem lojas públicas para seu aplicativo e lojas particulares para cada cliente. Os clientes podem até optar por compartilhar algumas de suas lojas ou objetos com outros usuários.
Não sei como é fácil acessar os dados brutos; os esquemas podem ser configurados no site da Apple.
Conclusão: Ótimo para aplicativos direcionados à Apple.
Couchbase
Grande nome, muitas grandes empresas por trás disso. Há uma Community Edition e Enterprise Edition com os custos de suporte padrão.
Eles têm um tutorial em seu site para conectar coisas ao React Native. Também não gastei muito tempo com este, mas parece ser uma alternativa viável ao Reino em termos de funcionalidade. Não sei como é fácil acessar seus dados fora do seu aplicativo ou de qualquer API que você criar.
[Editar: Encontrou um link antigo que fala sobre o Couchbase e o CouchDB, e o CouchDB pode ser mais uma opção a considerar. Os dois são produtos historicamente relacionados, mas atualmente completamente diferentes. Veja esta comparação .]
Conclusão: Parece ter recursos semelhantes aos do Reino. Pode ser apenas para dispositivo ou sincronizado. Eu preciso experimentar.
MongoDB
Atualização 4/2020
A Mongo adquiriu a Realm e planeja combinar o MongoDB Stitch (discutido abaixo) com o Realm (discutido acima).
Estou usando esse servidor para um pedaço do aplicativo que usa o AsyncStorage localmente. Gosto que tudo seja armazenado como objetos JSON, tornando a transmissão para os dispositivos clientes muito simples. No meu caso de uso, ele é usado como um cache entre um provedor upstream de dados do guia de TV e os dispositivos do meu cliente.
Como não há estrutura rígida para os dados, como um esquema, todos os objetos são armazenados como um "documento" facilmente pesquisável, filtrável, etc. Objetos JSON semelhantes podem ter atributos adicionais (mas diferentes) ou objetos filhos, permitindo um muita flexibilidade na forma como você estrutura seus objetos / dados.
Não tentei nenhum cliente para sincronizar recursos de servidor nem o usei incorporado. Reagir O código nativo do MongoDB existe.
Conclusão: Solução NoSQL apenas local, nenhuma opção óbvia de sincronização como Realm ou Firebase.
Atualização 2/2019
O MongoDB possui um "produto" (ou serviço) chamado Stitch. Como os clientes (no sentido de navegadores da web e telefones) não devem conversar diretamente com o MongoDB (isso é feito por código no servidor), eles criaram um front-end sem servidor com o qual seus aplicativos podem interagir, caso você opte por usar os solução hospedada (Atlas). Sua documentação faz parecer que existe uma opção de sincronização possível.
Este artigo de dezembro de 2018 discute o uso do React Native, Stitch e MongoDB em um aplicativo de exemplo, com outros exemplos vinculados no documento ( https://www.mongodb.com/blog/post/building-ios-and-android-apps -com-o-mongodb-stitch-react-native-sdk ).
Twilio Sync
Outra opção NoSQL para sincronização é a sincronização do Twilio. No site: "A sincronização permite gerenciar o estado de qualquer número de dispositivos em tempo real em escala sem precisar lidar com nenhuma infraestrutura de back-end".
Eu vi isso como uma alternativa ao Firebase para um dos projetos acima mencionados, especialmente depois de conversar com as duas equipes. Também gosto das outras ferramentas de comunicação e as usei para enviar mensagens de texto a partir de um aplicativo da web simples.
[Editar] Passei algum tempo com o Reino desde que escrevi isso originalmente. Gosto de não precisar escrever uma API para sincronizar os dados entre o aplicativo e o servidor, semelhante ao Firebase. As funções sem servidor também parecem ser realmente úteis com essas duas, limitando a quantidade de código de back-end que tenho que escrever.
Adoro a flexibilidade do armazenamento de dados do MongoDB, que está se tornando minha escolha para o lado do servidor de aplicativos baseados na Web e outros necessários para conexão.
Encontrei o RESTHeart , que cria uma API RESTful muito simples e escalável para o MongoDB. Não deve ser muito difícil criar um componente React (Native) que leia e grave objetos JSON no RESTHeart, que por sua vez os transmite para / do MongoDB.
[Editar] Adicionei informações sobre como os dados são armazenados. Às vezes, é importante saber quanto trabalho você pode ter durante o desenvolvimento e o teste, se precisar ajustar e testar os dados.
Edições 2/2019 Eu experimentei várias dessas opções ao criar um projeto de alta simultaneidade no ano passado (2018). Alguns deles mencionam limites de concorrência rígidos e flexíveis em sua documentação (o Firebase teve um difícil em 10.000 conexões, acredito, enquanto o Twilio era um limite flexível que poderia ser ultrapassado, de acordo com discussões com as duas equipes da AltConf).
Se você estiver projetando um aplicativo para dezenas a centenas de milhares de usuários, esteja preparado para dimensionar o back-end de dados de acordo.