自学内容网 自学内容网

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 适合存储结构化数据。通过合理选择本地存储方案,可以有效地实现数据持久化和离线功能。


课后作业

  1. 使用 AsyncStorage 实现一个简单的用户设置存储功能。
  2. 使用 SQLite 实现一个简单的用户信息管理应用。
  3. 阅读 AsyncStorage 和 SQLite 官方文档,深入了解其高级用法和最佳实践。

导师简介

前腾讯电子签的前端负责人,现 whentimes tech CTO,专注于前端技术的大咖一枚!一路走来,从小屏到大屏,从 Web 到移动,什么前端难题都见过。热衷于用技术打磨产品,带领团队把复杂的事情做到极简,体验做到极致。喜欢探索新技术,也爱分享一些实战经验,帮助大家少走弯路!

温馨提示:可搜老码小张公号联系导师


原文地址:https://blog.csdn.net/bravekingzhang/article/details/143767646

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!