数据持久化概念
了解如何在您的 Flutter 应用中本地持久化数据。
Flutter 中的数据持久化
大多数移动应用都需要处理数据。如果每次重启应用时数据都丢失,将会非常令人沮丧。将应用数据保存在非易失性存储中,使得即使应用完全关闭并重新启动后数据依然可用,这一过程称为数据持久化。
数据持久化具有以下优势:
- 持久化数据在用户关闭应用后仍然保留,允许用户从上次中断的地方继续操作。
- 即使在网络连接中断或离线状态下,用户也能持续使用应用进行工作。
- 只有用户自己可以删除持久化数据,这确保了后续仍可访问这些数据。
Flutter 提供了多种数据持久化选项供我们选择,包括:
- 键值存储
- 文件存储
- 本地数据库
- 远程数据存储
键值存储
在此方案中,数据以键值对的形式存储。键是对应值的唯一标识符。iOS 和 Android 均提供了原生机制来将键值对数据存储到磁盘上:iOS 使用 NSUserDefaults,Android 使用 SharedPreferences。Flutter 提供了 shared_preferences 插件,它封装了这两个平台的原生实现。
shared_preferences 插件用于存储基本数据类型,包括:
- 数字
- 字符串
- 布尔值
我们可以使用该插件来保存一些小型应用功能,例如:
- 用户进度(如游戏中的关卡进展)
- 用户偏好设置(如深色模式与浅色模式切换)
- 用户凭证(如认证令牌,根据用户是否登录来决定显示哪些内容)
不建议在以下情况使用 shared_preferences 插件:
- 存储复杂数据结构
- 存储敏感信息(如密码)
文件存储
有时我们需要读写磁盘上的文件。Flutter 提供了一个基于磁盘的文件系统,可以通过 File 类 来使用。
每个应用都有一个命名的内部存储目录,用于存放仅限该应用访问的私有文件。当应用被卸载时,系统会自动删除这些保存的文件。
文件存储可用于保存以下类型的内容:
- 文档
- 加密信息
- 媒体内容
本地数据库
当需要存储大量结构化数据时,应使用数据库而非文件存储或键值存储。数据库是一种可靠且易于访问的组织化数据集合。
Android 和 iOS 都支持基于 SQL 的 SQLite 数据库管理系统(DBMS)。SQLite 的特点包括:
- 使用单个文件存储所有数据表。
- 体积小且自包含,无需外部依赖。
- 无需额外配置即可直接使用。
- 支持在一个连接中同时访问多个数据库文件。
- 使用前需具备一定的 SQL 知识。
Flutter 可通过 sqflite 插件 或 Moor 包 来使用 SQLite 数据库管理系统。
远程数据库
使用本地数据库、文件存储或键值存储时,可能会遇到以下两个问题:
- 当用户卸载应用时,应用数据会丢失。
- 用户在另一台设备上登录时,无法访问之前存储的数据。
为解决这些问题,我们需要将数据存储在远程数据库中,例如 Firebase 的 实时数据库 或 Cloud Firestore。