当前位置: 首页 > article >正文

每天一个Flutter开发小项目 (13) : 本地数据随心存取 - 构建SQLite ToDo 应用,掌握Flutter本地数据库操作

引言

再次热烈欢迎回到 每天一个Flutter开发小项目 系列博客! 不知不觉,我们已经携手走过了十二篇博客,从绚丽的动画效果到强大的地图定位,相信您已经掌握了丰富的 Flutter 开发技能,能够构建各种功能的应用界面。

然而,一个功能完善的应用,不仅要拥有精美的 UI 界面和流畅的用户体验,更要具备 数据持久化 (Data Persistence) 的能力。 用户在使用应用过程中产生的数据 (例如,用户设置、应用偏好、用户内容等),需要能够 长期保存 在本地设备上,以便用户下次打开应用时,数据仍然存在,而不是每次都从零开始。 本地数据库 (Local Database) 正是实现数据持久化的关键技术之一。 今天,我们将聚焦 Flutter 应用的 “数据存储” —— SQLite 本地数据库,并构建一个经典的 ToDo 待办事项应用,让您掌握 Flutter 应用本地数据存储、读取、更新、删除 (CRUD) 的全流程,打造数据驱动、功能更强大的 Flutter 应用。

通过本篇博客,您将深入学习:

  • Flutter 数据持久化的核心概念: 理解数据持久化的重要性,掌握 Flutter 中常用的数据持久化方案,以及 SQLite 本地数据库的优势和适用场景。
  • sqflite 插件的专业应用: 深入学习 sqflite 插件,掌握在 Flutter 应用中集成 SQLite 数据库,创建数据库、表,执行 SQL 语句,进行数据库 CRUD 操作的全流程。
  • SQLite 数据库 CRUD 操作: 学习如何使用 sqflite 插件提供的 API,实现 SQLite 数据库的 创建 (Create)读取 (Read)更新 (Update)删除 (Delete) 操作,掌握本地数据库操作的核心技能。
  • 异步数据库操作的最佳实践: 理解 Flutter 中数据库操作的异步特性,掌握使用 asyncawait 关键字处理异步数据库操作,避免阻塞 UI 线程,提升应用性能。
  • ToDo 待办事项应用的功能实现: 构建一个实用的 ToDo 待办事项应用,包括待办事项的 添加查看编辑删除标记完成状态 等核心功能,将 SQLite 本地数据库操作与 UI 界面完美结合。
  • Flutter 应用本地数据管理能力的专业技能: 从数据库集成到 CRUD 操作实现,全面提升 Flutter 应用本地数据管理能力的专业技能,为构建更复杂、更实用的 Flutter 应用奠定基础。

项目简介: ToDo 待办事项应用

我们的 ToDo 待办事项应用将围绕以下核心功能展开:

  • 待办事项列表展示: 应用主页展示已添加的待办事项列表,每个待办事项包含 标题完成状态 信息。
  • 添加待办事项: 提供添加新待办事项的功能,用户可以输入待办事项的 标题内容 (可选)
  • 编辑待办事项: 允许用户编辑已有的待办事项,修改 标题内容
  • 删除待办事项: 允许用户删除已完成或不需要的待办事项。
  • 标记完成状态: 用户可以标记待办事项为 已完成未完成 状态,并在列表中直观展示完成状态。
  • 数据持久化: 所有待办事项数据都将 存储在本地 SQLite 数据库 中,确保数据在应用关闭后仍然存在。

通过构建 ToDo 待办事项应用,我们将重点实践:

  • sqflite 插件集成: 在 Flutter 应用中集成 sqflite 插件,搭建本地 SQLite 数据库环境。
  • 数据库和表创建: 使用 sqflite 插件提供的 API 创建 SQLite 数据库,并创建用于存储待办事项数据的表 (例如,todos 表)。
  • 数据模型定义: 定义用于表示待办事项数据的数据模型类 (例如,Todo 类),包含 id, title, content, isCompleted 等属性。
  • 数据库 CRUD 操作实现: 使用 sqflite 插件提供的 API 实现对 todos 表的 创建 (Create - 添加待办事项)读取 (Read - 查询待办事项列表, 查询单个待办事项)更新 (Update - 编辑待办事项, 标记完成状态)删除 (Delete - 删除待办事项) 操作。
  • 异步数据库操作处理: 使用 asyncawait 关键字处理异步数据库操作,确保 UI 线程流畅运行。
  • UI 界面与数据库操作的结合: 将数据库 CRUD 操作与 Flutter UI 界面 (例如,ListView, TextField, Checkbox, FloatingActionButton 等) 结合,实现完整的 ToDo 待办事项应用功能。
  • Flutter 应用本地数据持久化的完整实现: 从数据库集成到 CRUD 操作实现,完整实现 Flutter 应用本地数据持久化的流程,掌握本地数据库应用的核心技术。

Flutter 数据持久化方案与 SQLite 数据库详解

在深入 ToDo 待办事项应用实战之前,我们先来深入理解 Flutter 数据持久化的核心概念,并重点解析 SQLite 本地数据库,为后续的实战打牢理论基础。

  • 数据持久化 (Data Persistence) 的重要性: 数据持久化是指将应用运行时产生的数据 长期保存 在存储介质上 (例如,磁盘、闪存等),以便在应用下次启动时,数据仍然可以被 恢复和使用。 数据持久化对于各种类型的应用都至关重要,尤其对于需要 存储用户数据、应用状态、离线数据 的应用,数据持久化更是必不可少。 常见的数据持久化应用场景包括:

    • 用户设置和偏好: 例如,应用的语言设置、主题设置、字体大小设置、消息通知设置等,用户设置一次后,需要持久化保存,以便下次启动应用时自动加载。
    • 用户账号和登录状态: 用户登录账号后,需要持久化保存用户的登录状态 (例如,Token, Session ID 等),以便下次启动应用时自动登录,无需用户重复输入账号密码。
    • 离线数据缓存: 对于需要从网络获取数据的应用 (例如,新闻阅读器、电商应用、社交应用等),可以将已获取的数据缓存到本地,以便在网络不可用时,仍然可以向用户展示缓存数据,提升用户体验。
    • 应用状态保存: 例如,游戏应用的游戏进度、编辑器应用的编辑状态、表单应用的填写状态等,应用状态需要持久化保存,以便用户下次打开应用时可以恢复到之前的状态。
    • 用户生成内容: 例如,ToDo 应用的待办事项、笔记应用的笔记内容、日记应用的日记内容等,用户生成的内容需要持久化保存,以便用户长期使用和管理。
  • Flutter 中常用的数据持久化方案: Flutter 提供了多种数据持久化方案,开发者可以根据应用的需求和数据特点选择合适的方案。 常用的 Flutter 数据持久化方案包括:

    • shared_preferences: 轻量级键值对存储,适用于 存储少量的简单数据 (例如,用户设置、应用偏好等)。 shared_preferences 将数据以键值对的形式存储在设备的 SharedPreferences (Android) 或 UserDefaults (iOS) 中,操作简单方便,但不适合存储大量数据或复杂数据结构
    • 文件存储 (File Storage): 将数据以文件的形式存储在本地文件系统 中,适用于 存储非结构化数据或少量结构化数据 (例如,文本文件、JSON 文件、图像文件、音频文件等)。 文件存储灵活性高,可以存储各种类型的数据,但数据查询和管理相对复杂不适合存储大量结构化数据
    • SQLite 本地数据库: 轻量级关系型数据库,适用于 存储大量的结构化数据 (例如,用户数据、应用数据、业务数据等)。 SQLite 数据库将数据存储在 本地数据库文件 中,支持 SQL 查询语言,可以进行高效的数据查询、更新、删除操作数据管理能力强大,是 移动应用中最常用的本地数据库
    • NoSQL 本地数据库 (例如,Isar, Hive): 非关系型数据库,适用于 存储半结构化或非结构化数据数据模型灵活读写性能高。 NoSQL 本地数据库在 Flutter 社区中也逐渐流行,例如,Isar 数据库 是专门为 Flutter 设计的 高性能 NoSQL 数据库Hive 数据库轻量级键值对 NoSQL 数据库,它们都提供了比 SQLite 更简洁、更高效的数据操作 API。
    • 云端数据库 (Cloud Database): 将数据存储在云端服务器 上,适用于 需要数据同步、多设备共享、云端备份 的应用 (例如,Firebase, AWS Amplify, Azure Mobile Apps 等)。 云端数据库提供了强大的数据同步、用户认证、云函数等功能,但 需要网络连接依赖云服务提供商成本较高
  • SQLite 本地数据库的优势和适用场景: SQLite 是一种 轻量级、跨平台、开源的关系型数据库,广泛应用于各种嵌入式系统和移动应用中。 Flutter 应用选择 SQLite 本地数据库作为数据持久化方案,具有以下优势:

    • 轻量级: SQLite 数据库 体积小巧资源占用少性能高效,非常适合移动设备的资源限制。
    • 本地存储: SQLite 数据库将数据存储在 本地设备 上,无需网络连接 即可进行数据访问,支持离线应用场景
    • 关系型数据库: SQLite 数据库是 关系型数据库支持 SQL 查询语言,提供了强大的数据查询、更新、删除功能,数据管理能力强大
    • 成熟稳定: SQLite 数据库 历史悠久广泛应用成熟稳定社区支持完善
    • 跨平台: SQLite 数据库 跨平台兼容支持 Android, iOS, Windows, macOS, Linux 等操作系统,在 Flutter 应用中可以实现 一套代码,多平台运行
    • 易于使用: Flutter 社区提供了 sqflite 插件,封装了 SQLite 数据库的底层操作,提供了 简洁易用的 API,方便开发者在 Flutter 应用中使用 SQLite 数据库。

    适用场景: SQLite 本地数据库 适合存储大量的结构化数据,例如:

    • ToDo 待办事项应用
    • 笔记应用
    • 日记应用
    • 联系人应用
    • 聊天消息记录
    • 离线缓存数据
    • 应用配置数据
  • sqflite 插件: Flutter 社区提供的 SQLite 数据库插件,用于在 Flutter 应用中集成 SQLite 数据库。 sqflite 插件基于原生平台 (Android 和 iOS) 的 SQLite 库构建,提供了 Flutter 平台访问 SQLite 数据库的 API,主要功能包括:

    • 数据库打开和关闭 (openDatabase, close): 打开或创建一个 SQLite 数据库连接,关闭数据库连接。
    • SQL 语句执行 (execute, query, insert, update, delete): 执行各种 SQL 语句,包括创建表、插入数据、查询数据、更新数据、删除数据等。
    • 事务处理 (transaction): 支持数据库事务,保证数据操作的原子性、一致性、隔离性、持久性 (ACID)。
    • 批量操作 (batch): 支持批量执行 SQL 语句,提高数据库操作效率。
    • 异步操作 (async/await): 所有数据库操作都是异步的,避免阻塞 UI 线程,保证应用流畅性。
    • 预编译 SQL 语句 (prepared statements): 支持预编译 SQL 语句,提高 SQL 语句执行效率和安全性。

实战步骤: 构建 ToDo 待办事项应用

接下来,我们将一步步使用 sqflite 插件构建我们的 ToDo 待办事项应用。

步骤 1: 创建新的 Flutter 项目并添加 sqflitepath_provider 依赖

首先,创建一个新的 Flutter 项目,命名为 todo_app_sqlite

然后在 pubspec.yaml 文件中添加 sqflitepath_provider 依赖:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0 #  使用最新版本,请查阅 pub.dev 获取最新版本号
  path_provider: ^2.0.0 #  使用最新版本,请查阅 pub.dev 获取最新版本号

运行 flutter pub get 命令获取依赖。

步骤 2: 创建数据模型类 (Todo)

创建 lib/models/todo.dart 文件,定义 Todo 类,用于表示待办事项数据。

创建 lib/models/todo.dart 文件:

class Todo {
   
  int? id; //  待办事项 ID (自增主键)
  String title; //  待办事项标题
  String? content; //  待办事项内容 (可选)
  bool isCompleted; //  是否完成

  Todo({
    //  构造函数
    this.id,
    required this.title,
    this.content,
    this.isCompleted = false, //  默认未完成
  });

  //  将 Todo 对象转换为 Map,用于数据库存储
  Map<String, dynamic> toMap() {
   
    return {
   
      'id': id,
      'title': title,
      'content': content,
      'is_completed': isCompleted ? 1 : 0, //  SQLite 中 boolean 类型用 0 和 1 表示
    };
  }

  //  从 Map 中创建 Todo 对象,用于从数据库读取数据
  factory Todo.fromMap(Map<String, dynamic> map) {
   
    return Todo(
      id: map['id'],
      title: map['title'],
      content: map['content'],
      isCompleted: map['is_completed'] == 1, //  将 0 和 1 转换为 boolean 类型
    );
  }
}

步骤 3: 创建数据库帮助类 (DatabaseHelper)

创建 lib/helpers/database_helper.dart 文件,定义 DatabaseHelper 类,用于封装数据库操作,包括数据库初始化、CRUD 操作等。 使用 单例模式 (Singleton Pattern) 确保全局只有一个 DatabaseHelper 实例。

创建 lib/helpers/database_helper.dart 文件:

import 'package:sqflite/sqflite.dart'; //  导入 sqflite 插件
import 'package:path/path.dart'; //  导入 path 插件
import 'package:path_provider/path_provider.dart'; //  导入 path_provider 插件

import '../models/todo.dart'; //  导入 Todo 数据模型

class DatabaseHelper {
   
  static const _databaseName = "TodoDatabase.db"; //  数据库名称
  static const _databaseVersion = 1; //  数据库版本号
  static const tableTodo = 'todos'; //  待办事项表名

  DatabaseHelper._privateConstructor(); //  私有构造函数,实现单例模式
  static final DatabaseHelper instance = DatabaseHelper._privateConstructor(); //  单例实例

  static Database? _database; //  Database 实例

  Future<Database> get database async {
    //  获取 Database 实例 (单例)
    if (_database != null) return _database!; //  如果已存在,直接返回
    _database = await _initDatabase(); //  如果不存在,初始化数据库
    return _database!;
  }

  Future<Database> 

http://www.kler.cn/a/573913.html

相关文章:

  • 算法·搜索
  • 《张一鸣,创业心路与算法思维》
  • 汽车AI识别及处理解决方案,引领未来驾驶新风尚
  • MybatisPlus从入门到精通
  • Linux基础 IO 和文件
  • Git安装与配置
  • 游戏树搜索与优化策略:Alpha-Beta剪枝及其实例分析
  • AI自动化应用的影响
  • IDC权威认证!永洪科技入选 IDC「GBI图谱」,点亮生成式 BI 价值灯塔
  • Redis的CPU高达90%时如何处理
  • STM32G030F6P6详细解读
  • upload-labs靶场 1-21通关
  • Go 语言中 panic 和 recover 的代价:性能与设计的权衡
  • css的毛玻璃效果backdrop-filter: blur()
  • 力扣hot100刷题——栈
  • 【C++设计模式】第七篇:桥接模式(Bridge)
  • Windows 10/11 系统下 Git 的详细安装步骤和基础设置指南
  • Power Settings Explorer官网下载地址: Windows电源选项设置管理工具
  • OSI七层网络结构和TCP/IP四层结构
  • 文件上传和下载前后端交互逻辑