数据持久化就是指应用程序将某些数据存储在手机存储空间中。

借助native存储

这种方式不言而喻,就是把内容传递给native层,通过原生API存储,详见从零学React Native之05混合开发

AsyncStorage API

RN框架为开发者提供了 AsyncStorage API,开发者可以利用它将任意“字符串键值对”保存到存储空间中。

它是简单的,异步的。用它可以取代Android的sharedperference和ios的NSUserDefault。

AsyncStorage存储的数据对该RN应用全局都是可以访问的,只需要知道通过它增删改查数据就可以了。

写入数据

开发者可以通过静态函数setItem来存储数据。setItem的JavaScript原型是:

static object setItem(key, value,aCallBack)
复制代码

写入数据有好几种方式,直接看代码:

    // 构造constructor(props) {super(props);this.doSomething=this.doSomething.bind(this);}doSomething(error){if(error!=null){   //如发生错误 处理console.log('error message:'+error.message);return;}// 执行保存成功的操作console.log("name保存成功!");}//下面4种写法, 推荐第三种和第四种componentWillMount() {//最简单的写法 , 无法检测保存何时结束,是否成功AsyncStorage.setItem('NO','01'); console.log("NO保存成功");// 通过自带的回调方法,一旦发生出错就可以监控到AsyncStorage.setItem('name','张三',this.doSomething);//Promise操作 ES2015推荐的写法AsyncStorage.setItem('age',"18").then(()=>{   //成功的操作console.log("age保存成功!");},);// 使用ES2017推荐的异步的写法this.saveSex();}// 箭头函数不需要在构造函数中bind(this)了saveSex = async ()=> {try {await AsyncStorage.setItem('sex','female');console.log("sex保存成功!");} catch(error) {console.error(error);}};
复制代码

当然, 还可以通过AsyncStorage的静态函数multiSet一次存储多个数据。

static object multiSet(aArray, aCallback)//参数类型
multiSet([['k1', 'val1'], ['k2', 'val2']], cb);
复制代码

Promise机制还可以通过下面的方式捕获异常 ,如果不了解Promise可以参考[React Native]Promise机制

        AsyncStorage.multiSet([['name','李四'],["sex","male"]]).then(()=>{console.log("name,sex保存成功");}).catch((errors)=>{console.log('error,length:'+errors.length);if(errors.length>0){  //保存操作有异常console.log(errors[0].message);//...}else{//异常不是数组,有可能是成功操作的处理函数抛出的异常//...}});
复制代码

获取数据

可以通过AsyncStorage类的静态函数getItem获取数据,JS原型是:

static object getItem(aKey,aCallback)
复制代码

直接看代码:

    componentWillMount() {//...//方式一 读取数据AsyncStorage.getItem("name", this.handleResult);//方式二AsyncStorage.getItem('sex').then(  //使用Promise机制的方法(result)=> {   //使用Promise机制,如果操作成功不会有error参数if (result == null) {//没有指定的keyreturn;}console.log("sex:" + result);}).catch((error)=> {  //读取操作失败console.log('error:' + error.message);});}handleResult(error, result) {if (error != null) {console.log('error message:' + error.message);return;}if (result == null) {//没有指定的keyreturn;}console.log("name:" + result);}
复制代码

当然也可以通过getAllKeys函数获取当前存储的所有键,再通过multiGet获取所有值。两个函数的原型分别是:

static object getAllkeys([aCallback])
static object multiGet(aArrays,aCallBack)
复制代码

官方示例代码:

AsyncStorage.getAllKeys((err, keys) => {AsyncStorage.multiGet(keys, (err, stores) => {stores.map((result, i, store) => {// get at each store's key/value so you can work with itlet key = store[i][0];let value = store[i][1];});});
});
复制代码

注意的是,AsyncStorage API存储数据是无序的。

开发者还可以通过AsyncStorage的静态函数flushGetRequests取消前面的所有未执行的完成的multiGet操作。

static object flushGetRequests()
复制代码

最好也借助Promise机制。

删除数据

删除数据通过 removeItem或者multiRemove 删除。 当然还可以通过clear函数全部清空。 函数原型:

static removeItem(key, callback?) static multiRemove(keys, callback?) static clear(callback?)
复制代码

写法和上面差不多, 就不列举示例代码了。

JSON对象存储

使用AsyncStorage类保存数据,只能通过key-value形式保存一个字符串类型的数据。很难满足开发者的需求。 但是配合JSON类,**把JSON格式的对象转换为一个字符串。**然后通过AsyncStorage类的key-value形式进行保存,就可以满足绝大多数需求了。

我们借助下上篇文章中[React Native] 解析JSON文件 中的json文件,通过JSON类就可以转化为字符串了, 注意,因为JSON是js自带的对象千万别化蛇添足把JSON添加到import组件中

let studentData = require('./data/student.json');
let newJSONString=JSON.stringify(studentData);
复制代码

读取出来的字符串也可以转换回JSON对象。

let jsonObject=JSON.parse(newJSONString)
复制代码

需要注意的是 JSONparse函数要求严格,不允许有尾逗号,如果有机会抛出异常,如下:

JSON.parse('{"name":"张三" ,}');
复制代码

数据库

如果你想存放数据结构复杂的数据的时候,就需要用到数据库,比如sqlite这种跨平台的数据存储方式在ReactNative里也有对应的方式,那就是react-native-sqlite。点这里可以进行下载集成到应用程序中。

处理sqlite还有比较牛的就是realm,realm也支持react native了。大家可以按照官方文档去配置。 https://realm.io/docs/react-native/latest/

调用数据库相对复杂了,我们后面再详细介绍。

更多精彩请关注微信公众账号likeDev,公众账号名称:爱上Android。

从零学React Native之13 持久化存储相关推荐

  1. 从零学React Native之12 组件的生命周期

    一个React Native组件从它被加载,到最终被卸载会经历一个完整的生命周期.所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命周期,是合理开发的关键. ES6语法和之前的ES5 ...

  2. 从零学React Native之07View

    View 组件是React Native最基本的组件.绝大部分其他React Native 组件. View组件的颜色和边框 backgroundColor 键用来指定颜色. RN 0.19版本开始, ...

  3. network reactnative_从零学React Native之14 网络请求

    通过HTTP或者HTTPS协议与网络侧服务器交换数据是移动应用中常见的通信方式. node-fetch是RN推荐的请求方式. React Native框架在初始化项目时, 引入了node-fetch包 ...

  4. 从零学React Native之05混合开发

    本篇文章,我们主要讨论如何实现Android平台的混合开发. RN给Android端发送消息 首先打开Android Studio, Open工程, 在React Native项目目录下选择andro ...

  5. 从零学React Native之01创建第一个程序

    上一篇文章是时候了解React Native了介绍了React Native.大家应该对React Native有个初步的认识. 接下来我们就可以初始化一个React Native项目了. 创建项目 ...

  6. React Native零基础+React Native重入门到精通+混合APP完整版

    第1章 介绍课程目标和学习内容 包括课程概述.课程安排.学习前提.讲授方式等方面的介绍,最后演示了整个招聘App的功能,让同学们对课程项目有一个直观的了解. 1-1 课程导学 第2章 知识储备 2-1 ...

  7. [React Native]高度自增长的TextInput组件

    之前我们学习了从零学React Native之11 TextInput了解了TextInput相关的属性. 在开发中,我们有时候有这样的需求, 希望输入区域的高度随着输入内容的长度而增长, 如下: 这 ...

  8. React Native等比放大不丢失图片

    9月11号 0.33版本,resizeMode中添加了center, 可以实现一样的功能.不过希望这篇文章还能帮助大家. 之前我们学习了从零学React Native之08Image组件 大家可以发现 ...

  9. React Native自定义导航栏

    之前我们学习了可触摸组件和页面导航的使用的使用: 从零学React Native之09可触摸组件 - 从零学React Native之03页面导航 - 经过之前的学习, 我们可以完成一个自定义导航栏了 ...

最新文章

  1. 连续连通域检测算法的MATLAB仿真
  2. eclipse3.4+对的处理插件(附SVN插件安装实例)
  3. i9100美化android.policy.jar,摆脱越狱束缚 三星I9100安装应用更轻松
  4. nginx 的 proxy_cache 缓存配置
  5. linux编辑查看命令,Linux的文本编辑和文本内容查看命令
  6. python决策树预测模型_「数据挖掘入门系列」数据挖掘模型之分类与预测 - 决策树...
  7. mysql数据库相关基础知识02
  8. 将新项目上传到svn
  9. 自制1寸照片及打印排版
  10. 运用二维数组打印杨辉三角(找规律题)
  11. 百度AI市场热品试用 | 迪威泰超薄双目摄像机模组
  12. 贪心科技SkipGram 2020.4.3笔记
  13. 大数据:商业革命与科学革命
  14. 测试--插拔寿命测试
  15. 服务器系统如何截图,电脑截图的快捷键是什么,小编告诉你电脑怎么截图
  16. ssm报错:Invalid bound statement (not found): mapper.UserMapper.findAllUser
  17. 一线城市中小公司的月薪10k前端工程师应该会什么?
  18. VMware虚拟机与windows主机之间相互复制粘贴
  19. u盘电视测试软件,智能电视无法识别U盘里的APK文件?当贝市场教你搞定
  20. kali使用笔记本自带无线网卡_生活日常(教你笔记本电脑如何正确使用WiFi)

热门文章

  1. C#生成唯一的字符串或者数字
  2. Domino+Qucikplace+Sametime构建企业办公平台图文攻略(三)
  3. 让我们带着感恩的心生活
  4. 第一个Mybatis程序示例 Mybatis简介(一)
  5. Operations Manager 2007 R2系列之单台性能视图
  6. J2ME下漫游(追逐)AI的实现
  7. 《PowerShell V3——SQL Server 2012数据库自动化运维权威指南》——2.8 创建数据库...
  8. MySQL · 社区动态 · MariaDB 10.2 前瞻
  9. CSS:CSS+DIV布局网页
  10. UTF-8 BOM(EF BB BF)