Вот то, что я узнал, когда я определил лучший способ продвинуться с парой моих текущих проектов приложений.
Асинхронное хранилище («встроенное» в React Native)
Я использую AsyncStorage для производственного приложения. Хранилище остается локальным для устройства, не зашифровано (как упомянуто в другом ответе), удаляется, если вы удаляете приложение, но должно быть сохранено как часть резервных копий вашего устройства и сохраняется во время обновлений (как собственных обновлений ala TestFlight, так и обновлений кода через CodePush ).
Вывод: локальное хранилище; Вы предоставляете свое собственное решение для синхронизации / резервного копирования.
SQLite
Другие проекты, над которыми я работал, использовали sqlite3 для хранения приложений. Это дает вам SQL-подобный опыт со сжимаемыми базами данных, которые также можно передавать на устройство и с него. У меня не было опыта синхронизации их с бэкэндом, но я думаю, что существуют различные библиотеки. Есть библиотеки RN для подключения к SQLite.
Данные хранятся в вашем традиционном формате базы данных с базами данных, таблицами, ключами, индексами и т. Д. Все они сохраняются на диск в двоичном формате. Прямой доступ к данным доступен через командную строку или приложения с драйверами SQLite.
Вывод: локальное хранилище; Вы предоставляете синхронизацию и резервное копирование.
Firebase
Firebase предлагает, помимо прочего, базу данных noSQL в реальном времени вместе с хранилищем документов JSON (например, MongoDB), предназначенным для синхронизации от 1 до n числа клиентов. В документах говорится об автономном постоянстве, но только для собственного кода (Swift / Obj-C, Java). Собственная опция Google («Web»), используемая React Native, не предоставляет опцию кэшированного хранилища (см. Обновление 2/18 ниже). Библиотека написана с предположением, что веб-браузер будет подключаться, и поэтому будет полупостоянное соединение. Возможно, вы могли бы написать локальный механизм кэширования, чтобы дополнить вызовы хранилища Firebase, или вы могли бы написать мост между нативными библиотеками и React Native.
Обновление 2/2018
С тех пор я обнаружил React Native Firebase, который предоставляет совместимый интерфейс JavaScript для нативных библиотек iOS и Android (делая то, что, вероятно, мог бы / должен был сделать Google), предоставляя вам все прелести нативных библиотек с бонусом React. Родная поддержка. С введением Google хранилища документов JSON рядом с базой данных в реальном времени, я даю Firebase хороший второй взгляд на некоторые приложения в реальном времени, которые я планирую создать.
База данных в реальном времени хранится в виде JSON-подобного дерева, которое вы можете редактировать на веб-сайте и довольно просто импортировать / экспортировать.
Вывод: с реактивной базой firebase RN получает те же преимущества, что и Swift и Java. [/ update] Хорошо масштабируется для устройств, подключенных к сети. Низкая стоимость за низкое использование. Прекрасно сочетается с другими облачными предложениями Google. Данные легко видны и редактируются из их интерфейса.
область
Обновление 4/2020
MongoDB приобрела Realm и планирует объединить его с MongoDB Stitch (обсуждается ниже). Это выглядит очень захватывающе .
Также хранилище объектов в реальном времени с автоматической синхронизацией сети. Они рекламируют себя как «устройство в первую очередь», и демонстрационное видео показывает, как устройства справляются со спорадическими или потерянными сетевыми подключениями.
Они предлагают бесплатную версию хранилища объектов, которое вы размещаете на своих собственных серверах или в облачном решении, таком как AWS или Azure. Вы также можете создавать хранилища в памяти, которые не сохраняются на устройстве, хранилища только для устройств, которые не синхронизируются с сервером, хранилища сервера только для чтения и возможность полной чтения-записи для синхронизации между одним или несколькими устройствами. У них есть профессиональные и корпоративные варианты, которые стоят дороже в месяц, чем Firebase.
В отличие от Firebase, все возможности Realm поддерживаются в React Native и Xamarin, так же как и в приложениях Swift / ObjC / Java (native).
Ваши данные привязаны к объектам в вашем коде. Поскольку они являются определенными объектами, у вас есть схема, и контроль версий является обязательным условием для кода. Прямой доступ доступен через инструменты GUI, предоставляемые Realm. Файлы данных на устройстве являются кросс-платформенными.
Вывод: сначала устройство, дополнительная синхронизация с платными и бесплатными тарифами. Все функции поддерживаются в React Native. Горизонтальное масштабирование дороже, чем Firebase.
ICloud
Я, честно говоря, не очень много играл с этим, но буду делать это в ближайшем будущем.
Если у вас есть нативное приложение, использующее CloudKit, вы можете использовать CloudKit JS для подключения к контейнерам вашего приложения из веб-приложения (или, в нашем случае, React Native). В этом случае у вас, вероятно, будет собственное приложение для iOS и приложение для React Native для Android.
Как и Realm, он хранит данные локально и по возможности синхронизирует их с iCloud. Существуют публичные магазины для вашего приложения и частные магазины для каждого покупателя. Клиенты могут даже поделиться некоторыми своими магазинами или объектами с другими пользователями.
Я не знаю, как легко получить доступ к необработанным данным; схемы можно настроить на сайте Apple.
Вывод: отлично подходит для приложений, ориентированных на Apple.
Couchbase
Большое имя, множество крупных компаний. Существует Community Edition и Enterprise Edition со стандартными затратами на поддержку.
На их сайте есть учебное пособие по ознакомлению с React Native. Я также не потратил много времени на это, но он выглядит жизнеспособной альтернативой Realm с точки зрения функциональности. Я не знаю, насколько легко получить доступ к вашим данным за пределами вашего приложения или любых создаваемых вами API.
[Изменить: Нашел более старую ссылку, в которой говорится о Couchbase и CouchDB, и CouchDB может быть еще одним вариантом для рассмотрения. Эти два исторически связаны, но в настоящее время совершенно разные продукты. Смотрите это сравнение .]
Вывод: похоже, имеет схожие возможности, как Realm. Может быть только для устройства или синхронизированы. Мне нужно попробовать это.
MongoDB
Обновление 4/2020
Mongo приобрела Realm и планирует объединить MongoDB Stitch (обсуждается ниже) с Realm (обсуждается выше).
Я использую эту часть сервера для части приложения, которое использует AsyncStorage локально. Мне нравится, что все хранится в виде объектов JSON, что делает передачу на клиентские устройства очень простой. В моем случае он используется как кеш между вышестоящим провайдером данных телегида и моими клиентскими устройствами.
У данных нет жесткой структуры, как у схемы, поэтому каждый объект хранится в виде «документа», который можно легко найти, отфильтровать и т. Д. Подобные объекты JSON могут иметь дополнительные (но разные) атрибуты или дочерние объекты, что позволяет большая гибкость в том, как вы структурируете свои объекты / данные.
Я не пробовал какие-либо функции синхронизации между клиентом и сервером и не использовал их встроенными. Реактивный нативный код для MongoDB существует.
Вывод: только локальное решение NoSQL, нет очевидных вариантов синхронизации, таких как Realm или Firebase.
Обновление 2/2019
MongoDB имеет «продукт» (или услугу) под названием Stitch. Поскольку клиенты (в смысле веб-браузеров и телефонов) не должны напрямую общаться с MongoDB (это делается с помощью кода на вашем сервере), они создали серверный интерфейс, с которым ваши приложения могут взаимодействовать, если вы решите использовать их размещенное решение (Атлас). Их документация дает понять, что существует возможная опция синхронизации.
В этой статье, опубликованной в декабре 2018 года, обсуждается использование React Native, Stitch и MongoDB в примере приложения, а другие примеры связаны в документе ( https://www.mongodb.com/blog/post/building-ios-and-android-apps -with-mongodb-stitch-реакции-native-sdk ).
Twilio Sync
Другой вариант NoSQL для синхронизации - это Twilio's Sync. С их сайта: «Синхронизация позволяет вам управлять состоянием на любом количестве устройств в реальном времени в масштабе, не обращаясь к какой-либо серверной инфраструктуре».
Я рассматривал это как альтернативу Firebase для одного из вышеупомянутых проектов, особенно после общения с обеими командами. Мне также нравятся их другие инструменты коммуникации, и я использовал их для обновления текстовых сообщений из простого веб-приложения.
[Править] Я провел некоторое время с Царством, так как я первоначально написал это. Мне нравится, что мне не нужно писать API для синхронизации данных между приложением и сервером, как в Firebase. Бессерверные функции также выглядят очень полезными, ограничивая объем внутреннего кода, который я должен написать.
Мне нравится гибкость хранилища данных MongoDB, так что это становится моим выбором для серверной части веб-приложений и других приложений, требующих подключения.
Я нашел RESTHeart , который создает очень простой, масштабируемый RESTful API для MongoDB. Не должно быть слишком сложно создать компонент React (Native), который читает и записывает объекты JSON в RESTHeart, который, в свою очередь, передает их в / из MongoDB.
[Редактировать] Я добавил информацию о том, как хранятся данные. Иногда важно знать, сколько работы вы можете выполнить во время разработки и тестирования, если вам нужно настроить и протестировать данные.
Редакция 2/2019 Я экспериментировал с некоторыми из этих вариантов при разработке проекта с высокой степенью параллелизма в прошлом году (2018). Некоторые из них упоминают жесткие и мягкие ограничения параллелизма в своей документации (я полагаю, что у Firebase было жесткое ограничение на 10 000 соединений, в то время как Twilio был мягким пределом, который можно было увеличить, согласно обсуждениям с обеими командами в AltConf).
Если вы разрабатываете приложение для десятков или сотен тысяч пользователей, будьте готовы соответствующим образом масштабировать серверную часть данных.