文章目录

  • Flutter SQLite使用
    • 概述
    • 添加依赖
    • 使用SQLite
      • 使用单例类
      • 初始化
      • 增删改查操作
    • 完整代码如下
      • 数据库管理类
      • 定义实体类
      • 首页代码
      • 添加数据页面

Flutter SQLite使用

概述

保存数据到本地是应用程序非常重要的功能之一,比如如下场景:一个新闻类或者博客类的应用程序,打开后进入首页,如果本地没有保存数据,则需要通过网络获取数据,在返回数据之前,用户看到的是空白页面,而如果本地保存了部分新闻,则显示这部分数据,等待最新的数据返回时在刷新即可,对用户体验来说,明显第二种体验更佳。

SQLite 是目前最受欢迎的本地存储框架之一。

文件保存路径:/data/data/<package_name>/app_flutter目录下

添加依赖

dependencies:path_provider: ^2.0.11sqflite: ^2.0.2+1

使用SQLite

使用单例类

class DBManager {static final DBManager _instance = DBManager._();factory DBManager() {return _instance;}DBManager._();
}

初始化

class DBManager {/// 数据库名final String _dbName = "dbName";/// 数据库版本final int _version = 1;static final DBManager _instance = DBManager._();factory DBManager() {return _instance;}DBManager._();static Database? _db;Future<Database> get db async {// if (_db != null) {//   return _db;// }// _db = await _initDB();// return _db;return _db ??= await _initDB();}/// 初始化数据库Future<Database> _initDB() async {Directory directory = await getApplicationDocumentsDirectory();String path = join(directory.path, _dbName);return await openDatabase(path,version: _version,onCreate: _onCreate,onUpgrade: _onUpgrade,);}/// 创建表Future _onCreate(Database db, int version) async {const String sql = """CREATE TABLE Student(id INTEGER primary key AUTOINCREMENT,name TEXT,age INTEGER,sex INTEGER)""";return await db.execute(sql);}/// 更新表Future _onUpgrade(Database db, int oldVersion, int newVersion) async {}
}

增删改查操作

/// 保存数据
Future saveData(Student student) async {Database database = await db;return await database.insert("Student", student.toJson());
}/// 使用SQL保存数据
Future saveDataBySQL(Student student) async {const String sql = """INSERT INTO Student(name,age,sex) values(?,?,?)""";Database database = await db;return await database.rawInsert(sql, [student.name, student.age, student.sex]);
}/// 查询全部数据
Future<List<Student>?> findAll() async {Database? database = await db;List<Map<String, Object?>> result = await database.query("Student");if (result.isNotEmpty) {return result.map((e) => Student.fromJson(e)).toList();} else {return [];}
}///条件查询
Future<List<Student>?> find(int sex) async {Database database = await db;List<Map<String, Object?>> result =await database.query("Student", where: "sex=?", whereArgs: [sex]);if (result.isNotEmpty) {return result.map((e) => Student.fromJson(e)).toList();} else {return [];}
}/// 修改
Future<int> update(Student student) async {Database database = await db;student.age = 99;int count =await database.update("Student", student.toJson(), where: "id=?", whereArgs: [student.id]);return count;
}/// 删除
Future<int> delete(int id) async {Database database = await db;int count = await database.delete("Student", where: "id=?", whereArgs: [id]);return count;
}/// 删除全部
Future<int> deleteAll() async {Database database = await db;int count = await database.delete("Student");return count;
}

完整代码如下

数据库管理类

class DBManager {/// 数据库名final String _dbName = "dbName";/// 数据库版本final int _version = 1;static final DBManager _instance = DBManager._();factory DBManager() {return _instance;}DBManager._();static Database? _db;Future<Database> get db async {// if (_db != null) {//   return _db;// }// _db = await _initDB();// return _db;return _db ??= await _initDB();}/// 初始化数据库Future<Database> _initDB() async {Directory directory = await getApplicationDocumentsDirectory();String path = join(directory.path, _dbName);return await openDatabase(path,version: _version,onCreate: _onCreate,onUpgrade: _onUpgrade,);}/// 创建表Future _onCreate(Database db, int version) async {const String sql = """CREATE TABLE Student(id INTEGER primary key AUTOINCREMENT,name TEXT,age INTEGER,sex INTEGER)""";return await db.execute(sql);}/// 更新表Future _onUpgrade(Database db, int oldVersion, int newVersion) async {}/// 保存数据Future saveData(Student student) async {Database database = await db;return await database.insert("Student", student.toJson());}/// 使用SQL保存数据Future saveDataBySQL(Student student) async {const String sql = """INSERT INTO Student(name,age,sex) values(?,?,?)""";Database database = await db;return await database.rawInsert(sql, [student.name, student.age, student.sex]);}/// 查询全部数据Future<List<Student>?> findAll() async {Database? database = await db;List<Map<String, Object?>> result = await database.query("Student");if (result.isNotEmpty) {return result.map((e) => Student.fromJson(e)).toList();} else {return [];}}///条件查询Future<List<Student>?> find(int sex) async {Database database = await db;List<Map<String, Object?>> result =await database.query("Student", where: "sex=?", whereArgs: [sex]);if (result.isNotEmpty) {return result.map((e) => Student.fromJson(e)).toList();} else {return [];}}/// 修改Future<int> update(Student student) async {Database database = await db;student.age = 99;int count =await database.update("Student", student.toJson(), where: "id=?", whereArgs: [student.id]);return count;}/// 删除Future<int> delete(int id) async {Database database = await db;int count = await database.delete("Student", where: "id=?", whereArgs: [id]);return count;}/// 删除全部Future<int> deleteAll() async {Database database = await db;int count = await database.delete("Student");return count;}
}

定义实体类

Student studentFromJson(String str) => Student.fromJson(json.decode(str));String studentToJson(Student data) => json.encode(data.toJson());class Student {Student({this.id,this.name,this.age,this.sex,});Student.fromJson(dynamic json) {id = json['id'];name = json['name'];age = json['age'];sex = json['sex'];}int? id;String? name;int? age;int? sex;Map<String, dynamic> toJson() {final map = <String, dynamic>{};map['id'] = id;map['name'] = name;map['age'] = age;map['sex'] = sex;return map;}
}

首页代码

class SqlitePage extends StatefulWidget {const SqlitePage({Key? key}) : super(key: key);@overrideState<StatefulWidget> createState() {return _SqlitePageState();}
}class _SqlitePageState extends State<SqlitePage> {List<Student>? _studentList;loadAllData() async {_studentList = await DBManager().findAll();setState(() {});}loadData() async {_studentList = await DBManager().find(1);setState(() {});}updateData(Student student) async {var count = await DBManager().update(student);if (count > 0) {showSnackBar(context, "修改成功");} else {showSnackBar(context, "修改失败");}}deleteData(int id) async {var count = await DBManager().delete(id);if (count > 0) {showSnackBar(context, "删除成功");} else {showSnackBar(context, "删除失败");}}deleteAllData() async {var count = await DBManager().deleteAll();if (count > 0) {showSnackBar(context, "删除成功");} else {showSnackBar(context, "删除失败");}}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("SQLite"),actions: [IconButton(icon: const Icon(Icons.add),onPressed: () {Navigator.push(context, MaterialPageRoute(builder: (context) {return const AddStudentPage();}));},)],),body: SingleChildScrollView(child: Center(child: Column(children: [ElevatedButton(onPressed: () {loadAllData();},child: const Text("查询所有数据"),),ElevatedButton(onPressed: () {loadData();},child: const Text("条件查询"),),ElevatedButton(onPressed: () {deleteAllData();},child: const Text("删除全部"),),Padding(padding: const EdgeInsets.all(10),child: _buildTable(),),],),),),);}_buildTable() {return Table(border: TableBorder.all(),defaultVerticalAlignment: TableCellVerticalAlignment.middle,children: [const TableRow(children: [TableCell(child: Text("id")),TableCell(child: Text("姓名")),TableCell(child: Text("年龄")),TableCell(child: Text("性别")),TableCell(child: Text("修改")),TableCell(child: Text("删除")),]),...?_studentList?.map((e) => TableRow(children: [TableCell(child: Text("${e.id}")),TableCell(child: Text("${e.name}")),TableCell(child: Text("${e.age}")),TableCell(child: Text("${e.sex}")),TableCell(child: TextButton(onPressed: () {updateData(e);},child: const Text("修改"),),),TableCell(child: TextButton(onPressed: () {deleteData(e.id!);},child: const Text("删除"),),),])).toList(),],);}
}

添加数据页面

class AddStudentPage extends StatefulWidget {const AddStudentPage({Key? key}) : super(key: key);@overrideState<StatefulWidget> createState() {return _AddStudentPageState();}
}class _AddStudentPageState extends State<AddStudentPage> {int _sexValue = 0;late TextEditingController _nameController;late TextEditingController _ageController;@overridevoid initState() {_nameController = TextEditingController();_ageController = TextEditingController();super.initState();}@overridevoid dispose() {_nameController.dispose();_ageController.dispose();super.dispose();}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("增加学生"),),body: Padding(padding: const EdgeInsets.all(8.0),child: Column(children: [TextField(controller: _nameController,decoration: const InputDecoration(labelText: "姓名:"),),TextField(controller: _ageController,decoration: const InputDecoration(labelText: "年龄:"),inputFormatters: [FilteringTextInputFormatter.digitsOnly,],),Row(children: [Expanded(child: RadioListTile<int>(title: const Text("女"),value: 0,groupValue: _sexValue,onChanged: (value) {setState(() {_sexValue = value!;});},),),Expanded(child: RadioListTile<int>(title: const Text("男"),value: 1,groupValue: _sexValue,onChanged: (value) {setState(() {_sexValue = value!;});},),),],),Builder(builder: (BuildContext context) {return Column(children: [ElevatedButton(onPressed: () async {var student = Student(name: _nameController.text.toString(),age: int.parse(_ageController.text.toString()),sex: _sexValue,);int result = await DBManager().saveData(student);if (result > 0) {showSnackBar(context, '保存数据成功,result:$result');} else {showSnackBar(context, '保存数据失败,result:$result');}},child: const Text("保存数据"),),ElevatedButton(onPressed: () async {var student = Student(name: _nameController.text.toString(),age: int.parse(_ageController.text.toString()),sex: _sexValue,);int result = await DBManager().saveDataBySQL(student);if (result > 0) {showSnackBar(context, '保存数据成功,result:$result');} else {showSnackBar(context, '保存数据失败,result:$result');}},child: const Text("使用SQL保存数据"),),],);}),],),),);}
}

Flutter SQLite使用相关推荐

  1. flutter开发小程序_为什么我认为Flutter是移动应用程序开发的未来

    flutter开发小程序 I dabbled a bit in Android and iOS development quite a few years back using Java and Ob ...

  2. 远程终端管理和检测系统

    TerminalMACS(Terminal Manager And Check System) 远程终端管理和检测系统 本文同步更新地址:https://dotnet9.com/11429.html ...

  3. flutter bloc_如何在Flutter中使用Streams,BLoC和SQLite

    flutter bloc Recently, I've been working with streams and BLoCs in Flutter to retrieve and display d ...

  4. Flutter 全平台 sqlite/sqlcipher orm 框架 drift(原moor)的使用

    前言 Flutter 目前比较好用的 sqlite 数据库 orm 框架就是drift (以前叫作moor),由于dart语言不支持反射,这个框架使用了dart代码生成器,自动生成代码.这个数据库框架 ...

  5. flutter可以用 mysql数据库_Flutter 本地数据存储(文件、SharedPreferences 、数据库 sqlite)使用示例...

    Flutter 提供了三种数据持久化方法,即文件.SharedPreferences 与数据库. 文件 Flutter 提供了两种文件存储的目录,即临时(Temporary)目录与文档(Documen ...

  6. Flutter 精品项目之基于SQLite本地数据的日常支出手帐App(教程含源码)

    一.实战需求 Flutter 精品项目之基于SQLite本地数据的日常支出手帐App 由于给定的 UI 工具包创建描述所有功能的原型. 添加翻译(ukr,eng) 如果支持,身份验证应该在用户的设备上 ...

  7. sqlite复制数据主键重复_Flutter 数据库指南

    最近一段时间,在学 Flutter,打算把自己写过的项目 HOO 用 Flutter 实现. 里面用到了一些数据库的知识,正好这周我在组内也是分享的SQLite,所以我们就来聊一聊 SQLite 的基 ...

  8. etw系统provider事件较多_【Flutter 实战】文件系统目录

    老孟导读:Flutter 中获取文件路径,我们都知道使用 path_provider,但对其目录对含义不是很清楚,此文介绍 Android.iOS 系统的文件目录,不同场景下建议使用的目录. 不同的平 ...

  9. flutter开发中常用的dart插件

    flutter插件官网地址:https://pub.dartlang.org/packages/ 1. image_picker 一个可以从图库选择图片,并可以用相机拍摄新照片的flutter插件 2 ...

最新文章

  1. Linux内核网络栈1.2.13-网卡设备的初始化流程
  2. Educational Codeforces Round 94 (Rated for Div. 2) D(思维)
  3. UVALive 8518 - Sum of xor sum
  4. RocketMQ 重试机制
  5. APACHE的简单应用一
  6. 如何将知识引入机器学习模型提升泛化能力?
  7. react页面内嵌微信二维码 和 自定义样式 以及 微信网页共用unionId问题
  8. ubuntu常见问题有效解决办法
  9. office各版本网盘免费下载
  10. S7-200SMART PLC通过RS485接口与西门子SMART LINE系列触摸屏通信具体步骤
  11. Java 运行环境的安装、配置与运行
  12. 剪辑师:入门级无水印无片头片尾免费视频剪辑工具
  13. 亚马逊中国发布2018图书排行榜
  14. MVX Android设计架构浅析-MVVM
  15. Latex系列[2]--公式中的字体
  16. PIC16F877A单片机 (中断与定时器Timer1)
  17. 百度质量部面试体验之 三面
  18. 牛视源码定制,抖音矩阵系统,别和谐啊、、、
  19. 有道云笔记突然出现乱码 日记变成乱码
  20. 无人驾驶实战(一)——车载摄像头行车视频车道线跟踪

热门文章

  1. Android主线程阻塞处理及优化
  2. 解决bug : KeyError: ‘Non-existent config key: MODEL.×××××××ב
  3. ResetEvent()
  4. 【数理统计】极大似然估计
  5. 直击环球资源电子展:把“巨幕影院”戴在眼前是什么体验
  6. 隐马尔科夫算法之实现简易版的拼音输入法代码详解
  7. Springboot微服务调用超时处理
  8. Chrome学习笔记(三):UI组件,皮肤引擎
  9. grep命令常用用法示例
  10. 如何防止订单重复支付?