开发者如何为React Native选择合适的数据库

Posted WOT技术大会

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发者如何为React Native选择合适的数据库相关的知识,希望对你有一定的参考价值。

​开发者如何为React

本文将和大家一起深入讨论合适React Native的数据库的各种特性和优缺点,并最终给出为React Native应用进行选择时的建议。

如今,程序员们可以选用多种编程语言,来创建在线平台、网站和应用程序。其中,在编程社区中,广受不同开发背景的人员所推崇的一种流行语言,便是React Native。它是由Facebook的javascript工具包所构建,适合为移动平台、而非Web,设计和创建独特的用户界面。目前,React Native已被广泛地运用在采用JavaScript的框架,并为iosandroid平台构建移动应用的项目中。

可以说,该领域的开发者不但需要了解JavaScript和API服务、而且要能够构建前端的UI,维护跨平台的兼容性、以及整合基础架构与其他应用。下图展示了历年来,时下各种编程语言,在项目中被使用的占比分布。

​开发者如何为React

目前,适合React Native应用的数据库有:Async Storage、SQLite、Realm、以及PouchDB等。下面,我将和大家一起深入讨论各种数据库的特性和优缺点,并最终给出为React Native应用进行选择时的建议。

PART 01

MMKV存储

由C++开发的MMKV存储具有快速高效的特点,可方便您在React Native应用中快速地保存数据。同时,该数据库非常轻巧。它在Android上仅占50K空间,而在iOS上只有30K。如果被打包的话,其体积会更小。此外,MMKV不但支持redux-persist(持久化),而且允许用户保存任何形式(无论是否加密)的数据。

特征如下:


  • 支持加密(安全存储)。
  • 支持多实例(将用户数据与全局数据分开)。
  • 自定义存储位置。
  • 由于一切都是用C++编写的,因此具有高性能。
  • 比Async Storage快大约30倍。
  • 使用JSI框架,而不是旧的“桥”模式。
  • 支持iOS、Android和Web。
  • 易于使用React Hooks的API。

​开发者如何为React

PART 02

Realm数据库

由于可以使用动态映射到完整且专有的数据库引擎,基于SQLite的Realm能够处理各种原生的JavaScript对象,并在保持性能的同时,提供一套简单的API。同时,Realm允许开发者创建各种高级搜索、复杂的数据表示、以及在图表中的事物链接。

Realm在Android中属于轻量级数据库。与下文将讨论的SQLite相比,Realm不但使用的内存更少,而且在读写数据等常见操作上的速度更快。此外,它还具有极其丰富的功能集。

特征如下:


  • 由于Realm属于对象存储,因此对象之间的关系可以通过各种“链接”来实现。
  • 每个“链接”都能够创建一个与链接到当前对象的“反向链接”映射。
  • Realm可以更新其实例版本。
  • Realm带有零拷贝(zero-copy)架构,以及延迟加载(lazy-loaded)式的数据访问。

​开发者如何为React

PART 03

SQLite 

作为C语言数据存储库的SQLite,在移动应用程序中,特别适用于离线应用。许多平台都以简便的设置方式,提供了开箱即用的SQLite支持。而作为最著名的免费Android开发数据库之一,它不但具有开源的显著特点,而且可以满足开发人员广泛的项目需求。

特征


  • 能够在iOS和Android上提供相同JavaScript API。
  • 在各种Java和Native模式下,以及Android中都可以被使用。
  • 其简单的回调(callback)和Promises可以被用于连接JavaScript里的SQL事务。
  • 可以从应用程序包和沙箱中,导入预填充的SQLite数据库。
  • Windows能够像在iOS和Android上一样,支持回调API。

​开发者如何为React

PART 04

Firebase

Firebase实时数据库是一个由Google支持的应用开发平台,可允许开发人员为iOS、Android和web创建各种应用。而作为一种基于云端的NoSQL数据库,Firebase可以通过提供分析跟踪、报告、应用问题修复、以及市场和产品实验功能(experimentation capabilities)等服务,在用户之间实现实时存储和数据同步。

特征


  • 即使应用处于离线状态,数据也能在所有客户端之间实时同步。
  • 可以让开发人员更专注于打造出色的用户体验,而无需管理服务器。
  • Firebase为您准备好了通用的服务器、API和数据存储,您只需按照实际需求进行修改即可,而不需重新编写。
  • 按照云托管数据库的需求,Firebase可以将数据以JSON格式进行存储,并进一步持续同步到每个关联的客户端上。
  • 作为基于云服务的数据库,它可被用于管理应用程序的数据,并提供快速的数据结果。

​开发者如何为React

PART 05

WatermelonDB

在React Native和React的在线项目中,WatermelonDB提供了一种管理用户数据的新方法。它是专为创建复杂的React Native应用而设计的,且十分重视应用的实际性能。简单而言,由于Watermelon的架构与数据库无关,因此开发者可以横跨多个平台使用它,并能达到快速启动软件的效果。此外,作为一个高级数据管理层,Watermelon还可以根据平台的要求,连接到任何React原生的数据库层面上。

特征


  • 由于使用延迟加载,Watermelon DB可以只在被请求时才加载数据。据此,应用程序的可扩展性可以得到大幅增强。
  • 由于所有的查询都是在其不同的线程上完成的,因此大多数查询只需不到1毫秒的时间。
  • 无论后端的数据体量有多大,您都可以立即启动应用程序。
  • 它能够与iOS、Android和web相兼容。
  • 它使用JavaScript的静态类型检查器,通过Flow的方式进行静态类型转化。
  • 它具有快速、异步、多线程和高度缓存等特性,也可与同步引擎协同工作,以保持原生本地数据库与远程数据库的同步。

​开发者如何为React

PART 06

PouchDB 

PouchDB是一个基于Apache CouchDB的开源JavaScript类型的数据库。它针对在浏览器中的各种使用场景进行了优化。PouchDB在浏览器中会使用IndexedDB和WebSQL在本地存储数据,并且持续实现本地和远程数据库的交互。据此,PouchDB可以帮助Web开发人员创建具有离线和在线等效功能的应用。也就是说,它允许应用在离线时,将数据保存在本地,而在应用重新上线后,再与CouchDB和其他兼容的服务器相同步,以确保用户的数据始终为最新。

特征


  • 由于PouchDB提供的API在所有浏览器中都是相同的,因此它可以在各种浏览器中被流畅地使用。
  • 如果您对编程语言有所了解,那么学习和理解PouchDB并非难事。
  • 作为一种轻量级的API,我们可以方便地使用script标签来包含它。

​开发者如何为React

PART 07

Vasern  

Vasern是一种基于链接一致性的键-值存储式React Native数据存储系统。其目标是提供一个开源、且对开发人员友好的端到端数据库系统。而且,由于其数据引擎是从头开始创建的,因此Vasern提供了原生的性能。

特征

  • 它通过UTF-8编码来支持各种语言。
  • 能够支持字符串、整数、双精度、日期时间、以及引用等基本数据类型。
  • 可以通过schema来创建、更新、查询和删除各种记录。

​开发者如何为React

PART 08

MySQL、MongoDB和DynamoDB

一些小型组织往往会使用mysql、MongoDB和DynamoDB等服务器端数据库,进行React Native的应用开发。三者的比较如下:

​开发者如何为React

开发人员在选择数据库之前需要考虑什么?

众所周知,在中小型软件运行的过程时,数据往往是被保存在变量之中的。不过,当程序重启时,变量则会因为恢复初始值,而导致数据的丢失。对此,我们需要数据库在能够起到很好的数据存储、保持、以及在程序重启后的持续检索等作用。通常,我们可以在为React Native应用选择数据库之前,考虑如下方面:


  • 应确保数据库具有足够的内存,可供软件的执行。
  • 选择可以处理复杂数据结构(如整篇文档或对象)的数据库。
  • 当用户从离线恢复为在线状态时,应能够通过集成来实现数据库中数据的同步。
  • 容易实现应用与数据库的集成。

PART 09

小结    

上述介绍的各种数据库分别有着自己的一组特性和优缺点。因此,在为React Native应用选择合适的数据库时,开发人员应当清楚地了解自己的项目目标和应用需求,通过试用、比较和深入研究,从中选择最符合要求的数据库。

以上是关于开发者如何为React Native选择合适的数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何为 React Native 中调用的每次 onPress 函数提供自动增量?

如何为 React Native 锁定设备方向

如何为指数 create-react-native-app 配置 API 密钥

如何为 React Native 嵌套组件创建 Typescript 定义

如何为 react-native-camera 使用 refreshAuthorizationStatus 函数

如何为 react-native-video 构建自定义搜索栏