React Native本地存储方案总结

1. AsyncStorage(键值对存储)

  • 适用场景:简单键值对存储(如用户配置、Token、缓存数据)。
  • 特点:异步、轻量、API 简单,但性能一般,不推荐存储大量数据。
  • 安装
    npm install @react-native-async-storage/async-storage
    
  • 示例代码
    import AsyncStorage from '@react-native-async-storage/async-storage';// 存储数据
    const storeData = async (key, value) => {try {await AsyncStorage.setItem(key, JSON.stringify(value));} catch (error) {console.error('存储失败:', error);}
    };// 读取数据
    const getData = async (key) => {try {const value = await AsyncStorage.getItem(key);return value != null ? JSON.parse(value) : null;} catch (error) {console.error('读取失败:', error);return null;}
    };// 删除数据
    const removeData = async (key) => {try {await AsyncStorage.removeItem(key);} catch (error) {console.error('删除失败:', error);}
    };
    

2. SQLite(关系型数据库)

  • 适用场景:复杂结构化数据(如离线缓存、大量本地数据查询)。
  • 特点:支持 SQL 查询,适合复杂数据操作。
  • 安装
    npm install react-native-sqlite-storage
    
  • 示例代码
    import SQLite from 'react-native-sqlite-storage';// 打开数据库
    const db = SQLite.openDatabase({ name: 'mydb.db', location: 'default' });// 创建表
    db.transaction((tx) => {tx.executeSql('CREATE TABLE IF NOT EXISTS Users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, email TEXT)');
    });// 插入数据
    const insertUser = (name, email) => {db.transaction((tx) => {tx.executeSql('INSERT INTO Users (name, email) VALUES (?,?)', [name, email]);});
    };// 查询数据
    const getUsers = () => {return new Promise((resolve, reject) => {db.transaction((tx) => {tx.executeSql('SELECT * FROM Users',[],(tx, results) => resolve(results.rows.raw()),(error) => reject(error));});});
    };
    

3. MMKV(高性能键值存储)

  • 适用场景:高性能读写需求(如频繁操作的数据)。
  • 特点:同步 API、超高性能(比 AsyncStorage 快 30 倍),支持加密。
  • 安装
    npm install react-native-mmkv
    
  • 示例代码
    import { MMKV } from 'react-native-mmkv';// 初始化
    const storage = new MMKV();// 存储数据
    storage.set('username', 'JohnDoe');// 读取数据
    const username = storage.getString('username');// 删除数据
    storage.delete('username');
    

4. Realm(对象数据库)

  • 适用场景:复杂对象数据存储(如需要关联查询的本地数据库)。
  • 特点:支持对象模型、高性能查询,适合替代 SQLite。
  • 安装
    npm install realm
    
  • 示例代码
    import Realm from 'realm';// 定义数据模型
    class User extends Realm.Object {static schema = {name: 'User',properties: {id: 'int',name: 'string',email: 'string',},primaryKey: 'id',};
    }// 打开 Realm 数据库
    const realm = new Realm({ schema: [User] });// 写入数据
    realm.write(() => {realm.create('User', { id: 1, name: 'Alice', email: 'alice@example.com' });
    });// 查询数据
    const users = realm.objects('User').filtered('name == "Alice"');
    

5. 文件存储(react-native-fs)

  • 适用场景:大文件(如图片、视频、JSON 文件)的读写。
  • 安装
    npm install react-native-fs
    
  • 示例代码
    import { writeFile, readFile, DocumentDirectoryPath } from 'react-native-fs';// 写入文件
    const filePath = `${DocumentDirectoryPath}/myfile.txt`;
    await writeFile(filePath, 'Hello World!', 'utf8');// 读取文件
    const content = await readFile(filePath, 'utf8');// 删除文件
    await unlink(filePath);
    

6. Redux Persist(状态持久化)

  • 适用场景:与 Redux 结合的状态持久化。
  • 安装
    npm install redux-persist @react-native-async-storage/async-storage
    
  • 示例代码
    import { persistStore, persistReducer } from 'redux-persist';
    import AsyncStorage from '@react-native-async-storage/async-storage';
    import { createStore } from 'redux';// 配置 Redux Persist
    const persistConfig = {key: 'root',storage: AsyncStorage,
    };const rootReducer = (state = {}, action) => { /* Reducer 逻辑 */ };const persistedReducer = persistReducer(persistConfig, rootReducer);// 创建 Store 和 Persistor
    const store = createStore(persistedReducer);
    const persistor = persistStore(store);
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/79357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arduino程序函数详解与实际案例

一、Arduino程序的核心架构与函数解析 Arduino程序的核心由两个函数构成:setup() 和 loop()。这两个函数是所有Arduino代码的骨架,它们的合理使用决定了程序的结构和功能。 1.1 setup() 函数:初始化阶段 setup() 函数在程序启动时仅执行一次,用于完成初始化配置,例如设置…

【Unity】使用Socket建立客户端和服务端并进行通信的例子

Socket服务端: using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; public class SocketServer { public static Socket listenSocket;//监听Socket public static List<Socket>…

Qt connect第五个参数

在 Qt 中&#xff0c;QObject::connect 函数的第五个参数用于指定 连接类型&#xff08;Qt::ConnectionType&#xff09;&#xff0c;它决定了信号与槽之间的通信方式。以下是各枚举值的详解及使用场景&#xff1a; 1. Qt::AutoConnection&#xff08;默认值&#xff09; 行为…

【2025域适应科研日报】

本笔记主要为了记录自己的科研日报&#xff0c;前段时间刚开始想写的初衷也是为了自己的思考不跑偏&#xff0c;但是有几天又没有坚持下来&#xff0c;看到一位学长的文章&#xff0c;发现这种形式还是很有必要的&#xff0c;所以自己也打算坚持记录下来&#xff0c;由于还正在…

XrayR启动失败

公司要用服务器之间进行数据加密&#xff0c;这里用的XrayR 我使用的Centos 7。 我这里使用一键脚本安装后&#xff0c;/etc/XrayR目录下没有配置文件。 解决方案 XrayR安装时&#xff0c;系统没有unzip工具&#xff0c;也是会安装失败的&#xff0c;因为Centos7已经停止维…

鸿蒙文件上传-从前端到后端详解,对比jq请求和鸿蒙arkts请求区别,对比new FormData()和鸿蒙arktsrequest.uploadFile

需要权限&#xff1a;ohos.permission.INTERNET 1.nodejs自定义书写上传后端接口 传输过来的数据放在files?.image下 router.post(/upload,(req, res) > {var form new multiparty.Form();form.uploadDirpublic/images/uploads; //上传图片保存的地址(目录必须存在)fo…

编写教育网站后端页面笔记

callbacktitle.html 对应表: 对应的功能: 控制器层数据: 页面没有写内容 chapter.html 对应表: questionbank ,intofloortime,questionBank,title,didtitles,option,answer,analyse 对应的功能:问题反馈页面 控制器层数据(控制器类): ChapterQuestionbankTitle c…

日常开发小Tips:后端返回带颜色的字段给前端

一般来说&#xff0c;展示给用户的字体格式&#xff0c;都是由前端控制&#xff0c;展现给用户&#xff1b; 但是当要表示某些字段的数据为异常数据&#xff0c;或者将一些关键信息以不同颜色的形式呈现给用户时&#xff0c;而前端又不好判断&#xff0c;那么就可以由后端来控…

用spring-boot-maven-plugin打包成单个jar有哪些缺点优化方案

Spring Boot 的 Fat JAR&#xff08;通过 spring-boot-maven-plugin 打包&#xff09;虽然简化了部署&#xff0c;但也存在一些潜在缺点&#xff0c;需根据场景权衡&#xff1a; 1. 启动速度较慢 原因&#xff1a; Fat JAR 需要在启动时解压并加载所有依赖的 JAR 文件到类路径…

Flowable7.x学习笔记(十五)动态指定用户分配参数启动工作流程

前言 得益于之前我们的基础工程准备&#xff0c;我们终于可以正式启动工作流程了&#xff0c;在启动之前我们需要分配一下每个用户任务的用户信息&#xff0c;其中有三个选择&#xff1a;【办理人】/【候选组】/【候选用户】&#xff0c;我们需要将系统中的用户ID填入作为固定参…

力扣hot100——98.验证二叉搜索树

题目链接&#xff1a;98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 首先列举一个错误代码 class Solution { public:bool isValidBST(TreeNode* root) {if(rootnullptr) return true;if(root->right){if(root->right->val<root->val) return f…

数据结构学习之顺序表

在C语言学习到一定阶段之后&#xff0c;接下来我们就进入到了数据结构的部分内容。 目录 数据结构与线性表 顺序表 顺序表分类&#xff1a; 接下来我们要写一段代码实现动态顺序表。 首先我们需要准备三个文件&#xff1a; 1.接下来我们要定义一个数据表 2.当创建号我们的…

C# wpf

学习网址&#xff1a;控件的父类们 - WPF中文网 - 从小白到大佬 控件的父类&#xff1a; 由此我们可以得出结论&#xff0c;控件的父类们(准确的说&#xff0c;应该叫父类的父类的父类)&#xff0c;至少有如下几个类型&#xff1a; DispatcherObjectDependencyObjectVisualU…

JavaEE-多线程实战02

接上 多线程编程实战01 第三个多线程程序 package thread.test;//定义了一个叫MyThread3的类&#xff0c;实现了Runable接口,所以它必须重写run()方法 class MyThread3 implements Runnable {Overridepublic void run() {//线程执行的具体内容//进入一个无限循环&#xff0c;…

【无报错,亲测有效】如何在Windows和Linux系统中查看MySQL版本

如何在Windows和Linux系统中查看MySQL版本 MySQL作为最流行的开源关系型数据库管理系统之一&#xff0c;了解如何查看其版本信息对于开发者和数据库管理员来说是常用的一个基本操作。本文将详细介绍在Windows和Linux系统中查看MySQL版本的方法。 文章目录 如何在Windows和Linu…

数字智慧方案5961丨智慧能源与运维云平台解决方案(52页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。 资料解读&#xff1a;智慧能源与运维云平台解决方案 在当今数字化时代&#xff0c;能源管理与设备运维的智能化、高效化成为企业发展的关键。智慧能源与运维云平台解决方案应运而生&#xff0c;为企业提供了全面且先进的能源管理和运维手段…

Qt指南针

Qt写的指南针demo. 运行结果 滑动调整指针角度 实现代码 h文件 #ifndef COMPASS_H #define COMPASS_H#include <QWidget> #include <QColor>class Compass : public QWidget {Q_OBJECT// 可自定义属性Q_PROPERTY(QColor backgroundColor READ backgroundColor WRI…

北大新媒体运营黄金提示词 | 北大Deepseek系列第七弹《DeepSeek与新媒体运营》,13所大学系列一站下载

今天大师兄给大家推荐的是北京大学Deepseek系列第七弹《DeepSeek与新媒体运营》。 本文档系统介绍了DeepSeek模型在新媒体运营中的应用&#xff0c;技术原理、实践案例及行业挑战。 适用人群&#xff1a;新媒体运营人员、AI研究者、企业决策者。 思维导图 napkin生成 《老…

2025年真实面试问题汇总(一)

Spingboot中如何实现有些类是否加载 在 Spring Boot 中可以通过 条件化配置&#xff08;Conditional Configuration&#xff09; 来控制某些类是否加载。Spring Boot 提供了一系列 Conditional 注解&#xff0c;允许根据特定条件动态决定 Bean 或配置类是否生效。以下是常见的…

综合案例建模(2)

文章目录 螺旋片端盖多孔扭转环作业一作业二作业三 螺旋片端盖 上视基准面画草图&#xff0c;拉伸250&#xff0c;向外拔模15度 以地面圆&#xff08;如果不行就转换实体引用&#xff09;&#xff0c;创建螺旋线&#xff0c;锥形螺纹线15度向外 前视基准面去画草图 以上一步草图…