Каковы мои варианты хранения данных при использовании React Native? (iOS и Android)
Я все еще новичок в мире React Native, и, как правило, в мобильном/родном мире, и я нахожу документацию немного недостающей, когда дело доходит до сохранения данных.
Каковы мои варианты хранения данных в React Native и последствия каждого типа? Например, я вижу, что есть локальное хранилище и асинхронное хранилище, но тогда я также вижу такие вещи, как Realm, и я смущен, как все это будет работать с внешней базой данных.
I конкретно хочу знать:
- каковы различные варианты сохранения данных?
- для каждого из них каковы пределы этого постоянства (т. е. когда данные больше не доступны)? Например: при закрытии приложения, перезагрузить телефон и т. д.
- для каждого из них существуют ли различия (кроме общей настройки) между реализацией в iOS и Android?
- как сравнить параметры для доступа к данным в автономном режиме? (или как работает в автономном режиме доступ обычно обрабатывается?)
- есть ли другие соображения, которые я должен иметь в виду?
Спасибо за вашу помощь!
3 ответов:
вот что я узнал, когда я определяю лучший способ двигаться вперед с несколькими моими текущими проектами приложений.
Асинхронный Хранения ("встроенный" реагировать родной)
Я использую AsyncStorage для приложения в производстве. Хранилище остается локальным для устройства, не зашифровано (как упоминалось в другом ответе), уходит, если вы удалите приложение, но должно быть сохранено как часть резервных копий вашего устройства и сохраняется во время обновлений (как собственные обновления ala TestFlight, так и обновления кода через CodePush).
вывод: локальное хранилище; вы предоставляете свое собственное решение для синхронизации/резервного копирования.
SQLite
другие проекты, над которыми я работал, использовали sqlite3 для хранения приложений. Это дает вам SQL-подобный опыт, с сжимаемыми базами данных, которые также могут быть переданы на и с устройства. У меня не было никакого опыта синхронизации их с задней частью, но я предполагаю, что существуют различные библиотеки. Есть РН библиотек подключение к SQLite.
данные хранятся в традиционном формате базы данных с базами данных, таблицами, ключи, индексы и т. д. все сохранено на диск в двоичном формате. Прямой доступ к данным доступен через командную строку или приложения, которые имеют драйверы SQLite.
вывод: локальное хранилище; вы предоставляете синхронизацию и резервное копирование.
военнослужащих
Firebase предлагает, среди прочего, базу данных noSQL в реальном времени вместе с хранилищем документов JSON (например, MongoDB), предназначенный для синхронизации от 1 до n клиентов. В документах говорится об автономной сохраняемости, но только для собственного кода (Swift/Obj-C, Java). Собственный вариант JavaScript Google ("Web"), который используется React Native, не предоставляет опцию кэшированного хранения (см. обновление 2/18 ниже). Библиотека написана с предположением, что веб-браузер будет подключаться, и поэтому будет полупостоянное соединение. Вероятно, вы могли бы написать локальный механизм кэширования дополните вызовы хранилища Firebase, или вы можете написать мост между собственными библиотеками и React Native.
[обновление 2/2018] с тех пор я нашел React Native Firebase который обеспечивает совместимый интерфейс JavaScript для собственных библиотек iOS и Android (делая то, что Google, вероятно, мог/должен был сделать), предоставляя вам все плюсы собственных библиотек с бонусом поддержки React Native. С введением компанией Google в магазине документ JSON рядом база данных в реальном времени, я даю Firebase хороший второй взгляд на некоторые приложения в реальном времени, которые я планирую построить.
база данных в реальном времени хранится как JSON-подобное дерево, которое вы можете редактировать на веб-сайте и импортировать/экспортировать довольно просто.
вывод: с react-native-firebase RN получает те же преимущества, что и Swift и Java. [/update] хорошо масштабируется для сетевых устройств. Низкая цена для низкого использования. Прекрасно сочетается с другими облачными предложениями Google. Данные видны и редактируемый из их интерфейса.
область
также хранилище объектов в реальном времени с автоматической синхронизацией сети. Они рекламируют себя как "первое устройство", и демонстрационное видео показывает, как устройства обрабатывают спорадическое или потерянное сетевое подключение.
Они предлагают бесплатную версию хранилища объектов, которое вы размещаете на своих собственных серверах или в облачном решении, таком как AWS или Azure. Также можно создать хранилища в памяти, которые не сохраняются на устройстве, хранилища только для устройств, которые не синхронизируются с сервером, хранилища только для чтения и полный параметр чтения-записи для синхронизации между одним или несколькими устройствами. У них есть профессиональные и корпоративные варианты, которые стоят больше в месяц, чем Firebase.
В отличие от Firebase, все возможности Realm поддерживаются в React Native и Xamarin, так же как и в приложениях Swift/ObjC/Java (native).
ваши данные привязаны к объектам в коде. Потому что они определены объекты, у вас есть схема, и контроль версий является обязательным для здравомыслия кода. Прямой доступ доступен через GUI tools Realm предоставляет. Файлы данных на устройстве являются кросс-платформенными совместимыми.
вывод: устройство во-первых, дополнительная синхронизация с бесплатными и платными планами. Все функции поддерживаются в React Native. Горизонтальное масштабирование дороже, чем военнослужащих.
iCloud
Я честно не сделал много играть с этим, но будет делаем это в ближайшее время.
Если у вас есть собственное приложение, которое использует CloudKit, вы можете использовать CloudKit JS для подключения к контейнерам вашего приложения из веб-приложения (или, в нашем случае, React Native). В этом случае у вас, вероятно, будет собственное приложение iOS и приложение React Native для Android.
Как Realm, это хранит данные локально и синхронизирует его с iCloud, когда это возможно. Есть публичные магазины для вашего приложения и частные магазины для каждого клиента. Клиенты могут даже решили поделиться некоторыми своих магазинов или объектов с другими пользователями.
Я не знаю, насколько легко получить доступ к необработанным данным; схемы могут быть созданы на сайте Apple.
вывод: отлично подходит для приложений, ориентированных на Apple.
информационная
большое имя, много больших компаний за ним. Есть Community Edition и Enterprise Edition со стандартными расходами на поддержку.
у них есть учебник на своем сайте для подключения вещей к React Native. Я также не потратил много времени на это, но это выглядит как жизнеспособная альтернатива Realm с точки зрения функциональности. Я не знаю, насколько легко получить ваши данные за пределами вашего приложения или любых API, которые вы создаете.
[Edit: найдена более старая ссылка, которая говорит о Couchbase и CouchDB, и CouchDB может быть еще одним вариантом для рассмотрения. Двух исторически связанных, но в настоящее время совершенно разные продукты. Смотрите это сравнение.]
вывод: Кажется, имеют одинаковые возможности в мире. Может быть только для устройства или синхронизированы. Мне нужно это попробовать.
MongoDB
Я использую эту сторону сервера для части приложения, которое использует asyncstorage локально. Мне нравится, что все хранится как объекты JSON, что делает передачу на клиентские устройства очень простой. В моем случае использования он используется в качестве кэша между вышестоящим поставщиком данных TV guide и моими клиентскими устройствами.
там нет жесткого структура данных, как схема, поэтому каждый объект хранится как "документ", который легко доступен для поиска, фильтрации и т. д. Подобные объекты JSON могут иметь дополнительные (но разные) атрибуты или дочерние объекты, что обеспечивает большую гибкость в том, как вы структурируете свои объекты/данные.
Я не пробовал никаких функций синхронизации клиента с сервером, и я не использовал его встроенным. React Native code для MongoDB действительно существует.
вывод: локальное только решение NoSQL, нет очевидный вариант синхронизации как царство или опорного пункта.
[Edit] я провел некоторое время с Realm, так как я изначально написал это. Мне нравится, как мне не нужно писать API для синхронизации данных между приложением и сервером, подобно Firebase. Бессерверные функции также выглядят очень полезными с этими двумя, ограничивая количество бэкэнд-кода, который я должен написать.
Мне нравится гибкость хранилища данных MongoDB, так что это становится моим выбором для серверной части веб-приложения и другие приложения, необходимые для подключения.
нашел RESTHeart, который создает очень простой, масштабируемый RESTful API для MongoDB. Не должно быть слишком сложно построить компонент React (Native), который читает и записывает объекты JSON в RESTHeart, который, в свою очередь, передает их в/из MongoDB.
[Edit] я добавил информацию о том, как хранятся данные. Иногда важно знать, сколько работы вы можете выполнить во время разработки и тестирования, если вы должны настроить и проверить данные.
быстрый и грязный: просто использовать возвращение + react-redux + redux-persist + AsyncStorage для react-родной.
Он почти идеально подходит для react native world и работает как шарм для android и ios. Кроме того, вокруг него есть солидное сообщество и много информации.
для рабочего примера см. F8App от Facebook.
в чем разница варианты сохранения данных?
с react native, вы, вероятно, хотите использовать redux и redux-persist. Он может использовать несколько систем хранения. AsyncStorage и вместе корячиться-файловая система-хранилище вариантов РН.
есть и другие варианты, такие как Firebase или Realm, но я никогда не использовал их в проекте RN.
для каждого из них каковы пределы этого постоянства (т. е. когда данные больше не доступны)? Например: при закрытии применение, перезагрузка телефона и т. д.
с помощью redux + redux-persist вы можете определить, что сохраняется, а что нет. Если данные не сохраняются, они существуют во время работы приложения. При сохранении данные сохраняются между выполнением приложения (закрыть, открыть, перезагрузить телефон и т. д.).
AsyncStorage имеет ограничение по умолчанию 6 МБ на Android. Можно настроить больший предел (на Java-коде) или использовать redux-persist-filesystem-storage в качестве механизма хранения для Андроид.
для каждого из них существуют ли различия (кроме общей настройки) между реализацией в iOS и Android?
использование redux + redux-persist + AsyncStorage настройка точно такая же на android и iOS.
Как сравнить параметры для доступа к данным в автономном режиме? (или как обычно обрабатывается автономный доступ?)
используя обертывание, offiline доступа практически в автоматическом режиме благодаря ее частей конструкции (действий создатели и редукторы).
все данные, которые вы извлекли и сохранили, доступны, вы можете легко хранить дополнительные данные, чтобы указать состояние (выборка, успех, ошибка) и время его извлечения. Обычно запрос выборки не делает недействительными старые данные, и ваши компоненты просто обновляются при получении новых данных.
то же самое применяется в другом направлении. Вы можете хранить данные, которые вы отправляете на сервер, и которые все еще находятся в ожидании, и обрабатывать их соответствующим образом.
есть ли другие соображения, которые я должен иметь в виду?
React способствует реактивный способ создания приложений и Redux подходит очень хорошо на нем. Вы должны попробовать его, прежде чем просто использовать опцию, которую вы будете использовать в своем обычном приложении для Android или iOS. Кроме того, вы найдете гораздо больше документов и помощи для них.
люди выше попали в правильные заметки для хранения, хотя если вам также нужно рассмотреть любые данные PII, которые необходимо сохранить, то вы также можете спрятать в брелок, используя что-то вроде https://github.com/oblador/react-native-keychain так как ASyncStorage не зашифрован. Он может быть применен как часть конфигурации persist в чем-то вроде redux-persist.
Comments