React Native 全栈开发实战班 - 本地存储实现
在移动应用中,本地存储 是实现数据持久化的重要手段。React Native 提供了多种本地存储方案,包括异步存储(AsyncStorage)、SQLite 数据库以及其他第三方库。本章节将介绍如何使用 AsyncStorage 进行简单的键值对存储,以及如何使用 SQLite 进行更复杂的数据存储需求。
5.1 本地存储概述
本地存储 允许应用在设备上保存数据,即使应用关闭后数据仍然存在。常见的本地存储需求包括:
- 用户设置: 保存用户的偏好设置,如主题、语言等。
- 缓存数据: 缓存从服务器获取的数据,提高应用性能。
- 离线数据: 保存用户输入的数据,以便在离线时使用。
React Native 提供了多种本地存储方案:
- AsyncStorage: 简单的异步键值对存储,适用于存储少量数据。
- SQLite: 轻量级的关系型数据库,适用于存储结构化数据。
- 第三方库: 如 RealmDB、MobX 等,适用于更复杂的数据存储需求。
本章节将重点介绍 AsyncStorage 和 SQLite 的使用。
5.2 使用 AsyncStorage
AsyncStorage 是 React Native 提供的一个简单的异步键值对存储系统,适用于存储少量数据。
5.2.1 安装 AsyncStorage
对于 React Native 0.59 及以上版本,AsyncStorage 已经内置,无需额外安装。
对于 React Native 0.58 及以下版本,需要手动安装:
npm install @react-native-async-storage/async-storage
5.2.2 基本用法
设置数据:
import AsyncStorage from '@react-native-async-storage/async-storage';
const storeData = async (key, value) => {
try {
const jsonValue = JSON.stringify(value);
await AsyncStorage.setItem(key, jsonValue);
} catch (e) {
console.error(e);
}
};
获取数据:
import AsyncStorage from '@react-native-async-storage/async-storage';
const getData = async (key) => {
try {
const jsonValue = await AsyncStorage.getItem(key);
return jsonValue != null ? JSON.parse(jsonValue) : null;
} catch (e) {
console.error(e);
return null;
}
};
删除数据:
import AsyncStorage from '@react-native-async-storage/async-storage';
const removeData = async (key) => {
try {
await AsyncStorage.removeItem(key);
} catch (e) {
console.error(e);
}
};
示例:
// store.js
import AsyncStorage from '@react-native-async-storage/async-storage';
export const storeUser = async (user) => {
try {
const jsonValue = JSON.stringify(user);
await AsyncStorage.setItem('user', jsonValue);
} catch (e) {
console.error(e);
}
};
export const getUser = async () => {
try {
const jsonValue = await AsyncStorage.getItem('user');
return jsonValue != null ? JSON.parse(jsonValue) : null;
} catch (e) {
console.error(e);
return null;
}
};
export const removeUser = async () => {
try {
await AsyncStorage.removeItem('user');
} catch (e) {
console.error(e);
}
};
// UserManager.js
import React, { useEffect, useState } from 'react';
import { View, Text, Button, StyleSheet } from 'react-native';
import { storeUser, getUser, removeUser } from './store';
const UserManager = () => {
const [user, setUser] = useState(null);
useEffect(() => {
const loadUser = async () => {
const userData = await getUser();
setUser(userData);
};
loadUser();
}, []);
const handleStore = async () => {
const newUser = { name: '张三', age: 30 };
await storeUser(newUser);
setUser(newUser);
};
const handleRemove = async () => {
await removeUser();
setUser(null);
};
return (
<View style={styles.container}>
<Text style={styles.text}>User: {user ? user.name : 'None'}</Text>
<Button title="Store User" onPress={handleStore} />
<Button title="Remove User" onPress={handleRemove} />
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
text: {
fontSize: 18,
marginBottom: 10,
},
});
export default UserManager;
解释:
storeUser
函数用于存储用户数据。getUser
函数用于获取用户数据。removeUser
函数用于删除用户数据。UserManager
组件演示了如何使用这些函数来管理用户数据。
5.2.3 注意事项
- 数据大小限制: AsyncStorage 适用于存储少量数据,不适合存储大量数据。
- 性能: AsyncStorage 的性能不如 SQLite,不适合频繁读写操作。
- 安全性: AsyncStorage 不提供加密功能,敏感数据需要谨慎处理。
5.3 使用 SQLite
SQLite 是一个轻量级的关系型数据库,适用于存储结构化数据。React Native 可以通过第三方库(如 react-native-sqlite-storage
)来使用 SQLite。
5.3.1 安装 SQLite
npm install react-native-sqlite-storage
5.3.2 基本用法
初始化数据库:
import SQLite from 'react-native-sqlite-storage';
const db = SQLite.openDatabase(
{
name: 'mydb.db',
location: 'default',
},
() => {
console.log('Database opened');
},
(error) => {
console.error(error);
}
);
创建表:
const createTable = () => {
db.transaction((tx) => {
tx.executeSql(
'CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)',
[],
() => {
console.log('Table created');
},
(error) => {
console.error(error);
}
);
});
};
插入数据:
const insertUser = (name, age) => {
db.transaction((tx) => {
tx.executeSql(
'INSERT INTO users (name, age) VALUES (?, ?)',
[name, age],
(tx, results) => {
if (results.rowsAffected > 0) {
console.log('User inserted');
} else {
console.log('Insert failed');
}
},
(error) => {
console.error(error);
}
);
});
};
查询数据:
const getUsers = () => {
db.transaction((tx) => {
tx.executeSql(
'SELECT * FROM users',
[],
(tx, results) => {
const rows = results.rows;
for (let i = 0; i < rows.length; i++) {
console.log(rows.item(i));
}
},
(error) => {
console.error(error);
}
);
});
};
示例:
// SQLiteExample.js
import React, { useEffect } from 'react';
import { View, Text, Button, StyleSheet } from 'react-native';
import SQLite from 'react-native-sqlite-storage';
const SQLiteExample = () => {
useEffect(() => {
const db = SQLite.openDatabase(
{
name: 'mydb.db',
location: 'default',
},
() => {
console.log('Database opened');
createTable();
},
(error) => {
console.error(error);
}
);
const createTable = () => {
db.transaction((tx) => {
tx.executeSql(
'CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)',
[],
() => {
console.log('Table created');
},
(error) => {
console.error(error);
}
);
});
};
const insertUser = (name, age) => {
db.transaction((tx) => {
tx.executeSql(
'INSERT INTO users (name, age) VALUES (?, ?)',
[name, age],
(tx, results) => {
if (results.rowsAffected > 0) {
console.log('User inserted');
} else {
console.log('Insert failed');
}
},
(error) => {
console.error(error);
}
);
});
};
insertUser('李四', 25);
insertUser('王五', 28);
getUsers();
return () => {
db.close();
};
}, []);
const getUsers = () => {
db.transaction((tx) => {
tx.executeSql(
'SELECT * FROM users',
[],
(tx, results) => {
const rows = results.rows;
for (let i = 0; i < rows.length; i++) {
console.log(rows.item(i));
}
},
(error) => {
console.error(error);
}
);
});
};
return (
<View style={styles.container}>
<Text style={styles.text}>SQLite Example</Text>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
text: {
fontSize: 18,
},
});
export default SQLiteExample;
解释:
openDatabase
方法用于打开或创建数据库。createTable
函数用于创建users
表。insertUser
函数用于插入用户数据。getUsers
函数用于查询用户数据。
5.3.3 注意事项
- 性能: SQLite 适合存储大量数据,但不适合非常频繁的读写操作。
- 安全性: SQLite 不提供加密功能,敏感数据需要谨慎处理。
- 第三方库: 需要安装和配置第三方库,并处理原生模块的兼容性。
总结
本章节介绍了 React Native 中的本地存储方案,包括 AsyncStorage 和 SQLite 的使用。AsyncStorage 适用于存储少量数据,而 SQLite 适合存储结构化数据。通过合理选择本地存储方案,可以有效地实现数据持久化和离线功能。
课后作业
- 使用 AsyncStorage 实现一个简单的用户设置存储功能。
- 使用 SQLite 实现一个简单的用户信息管理应用。
- 阅读 AsyncStorage 和 SQLite 官方文档,深入了解其高级用法和最佳实践。
导师简介
前腾讯电子签的前端负责人,现 whentimes tech CTO,专注于前端技术的大咖一枚!一路走来,从小屏到大屏,从 Web 到移动,什么前端难题都见过。热衷于用技术打磨产品,带领团队把复杂的事情做到极简,体验做到极致。喜欢探索新技术,也爱分享一些实战经验,帮助大家少走弯路!
温馨提示:可搜老码小张公号联系导师
原文地址:https://blog.csdn.net/bravekingzhang/article/details/143767646
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!