Flutter 本地数据库sqflite实战操作

通过本文章将带你了解sqflite如何使用并管理,注意要学习本功能、要具备一定的sql数据库操作的基础知识!

知识点:

  • 本地化列表数据
  • 本地化列表详情数据
  • sqflite 本地化数据库增删改查操作
一、安装sqflite

https://pub.flutter-io.cn/packages/sqflite

二、创建Db数据库文件夹,创建Db文件

文件夹路径:Lib/Db/StepTasksDb/StepTasksDb.dart

三、编辑Db文件

StepTasksDb.dart全部代码

import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';// 定义数据库Mock模型
final String tableName = 'step_task_table';                       // 数据库名称
final String columnId = '_id';                                    // 索引id
final String columnType = 'step_listType';                        // 列表类型
final String columnStepListData = 'step_listData';                // 列表数据
final String columnStepDataDetails = 'step_status';               // 列表详情数据// 定义模板模型类
class StepTasks {int id;String stepListType;                                            // 列表类型String stepListData;                                            // 列表数据String stepDataDetails;                                         // 详情数据StepTasks({this.id, this.stepListType, this.stepListData, this.stepDataDetails});// 模型转Map数据使用Map<String, Object> toMap() {var map = <String ,Object>{columnType:stepListType,columnStepListData:stepListData,columnStepDataDetails:stepDataDetails};if (id != null) {map[columnId] = id;}return map;}// 模型数据传入类中StepTasks.fromMap(Map<String, Object> map){id = map[columnId];stepListType = map[columnType];stepListData = map[columnStepListData];stepDataDetails = map[columnStepDataDetails];}
}// 定义数据库
class StepTasksDb {Database db;// 初始化数据库Future<String> initDatabase() async {// 获取本地存储数据库路径var databasesPath = await getDatabasesPath();// 创建数据库db文件String path = join(databasesPath, 'stepTasks.db');return path;}// 打开并创建表Future open(String path) async {print('------------------打开并创建表<StepTasksDb>------------------');db = await openDatabase(path, version:1, onCreate:(Database db, int version) async {await db.execute('''create table $tableName ($columnId integer primary key autoincrement,$columnType text ,$columnStepListData text ,$columnStepDataDetails text)''');});}// 添加数据Future<StepTasks> insert(StepTasks data) async {data.id = await db.insert(tableName, data.toMap());return data;}// 获取数据(根据type条件查询)Future<List> getData({type = ''}) async {List<Map> maps = [];maps = await db.query(tableName, columns:[columnId, columnType, columnStepListData, columnStepDataDetails], where: '$columnType = ?', whereArgs: [type]);if(maps ==null || maps.length == 0){return [];}List list = [];for(int i = 0; i<maps.length; i++){list.add(maps[i]);}return list;}// 修改数据(通过id匹配修改整个数据)Future<int> update(StepTasks data) async {return await db.update(tableName, data.toMap(), where: '$columnId = ?', whereArgs: [data.id]);}// 删除数据(通过id匹配删除数据)Future<int> delete(int id) async {return await db.delete(tableName, where:'$columnId = ?', whereArgs:[id]);}// 关闭此表的链接Future close() async => db.close();
}
四、使用创建的数据库文件

注意:
首先安装网络监听插件:connectivity,虽然本插件已经停止更新了,但是在Pub官方文档也有新的插件替代了旧插件,大家可以凭个人需求来,这里不强求用什么插件,只需要达到网络监听效果即可。

import 'dart:convert';
import 'package:flutter/material.dart';
import 'TestDb_Flutter/Db/StepTasksDb/StepTasksDb.dart';class TestDbPage extends StatefulWidget {@overrideState<TestDbPage> createState() => _TestDbPageState();
}class _TestDbPageState extends State<TestDbPage> {var listData = [];var _storageListData = [];          // 存储本地数据List cacheSelectList = [];          // 存储需要缓存的数据var networkStatus = -1;           // -1:没有网络 1:wifi  2:4GStepTasksDb _stepTaskDb = StepTasksDb();@overridevoid initState() { super.initState();_initDatabase();}// 打开数据库Future _initDatabase() async {String path = await _stepTaskDb.initDatabase();// await File(path).delete();       // 删除表await _stepTaskDb.open(path);       // 打开表_getListData();}// 网络请求数据Future _getListData() async {await _getStorageData();if(networkStatus == 1){var res = await api.request('https://xxx.xxxx/api');setState((){listData = res['data']})return res;}else{// 没有网络的话setState(() {_listData = _storageListData;});return _storageListData;}}// 获取本地数据Future _getStorageData() async {var data = await _stepTaskDb.getData(type: 'process');   setState(() {_storageListData = data;           // 先赋值一次 以便添加时使用});}@overridevoid dispose() {// 关闭数据库_stepTaskDb.close();super.dispose();}@overrideWidget build(BuildContext context) {return ListView.builder(itemCount: listData.length,itemBuilder: (context, index){return InkWell(child:Container(child:Text(listData[index]['title']));onTap:(){// 创建要存储本地的数据var dataBase = {'step_listData': json.encode(listData[index]),};// 请求详情的参数var params = {id:'xxx'};var res = await api.request('https://xxx.xxxx/api', formData: params);// 不为空的话,证明拿到了正常数据,将其存储到要存储的数据参数中if(res != null){dataBase['assets_listDetails'] = json.encode(res['data']);}// 进行本地缓存var db_res = await _stepTaskDb.insert(StepTasks(stepListType:'process', stepListData:dataBase['step_listData'], stepDataDetails:dataBase['assets_listDetails']));},onLongPress: (){// 只在获取了本地存储的情况下,才能够通过id删除数据_stepTaskDb.delete(v['_id']);},);},);}
}

以上代码暂且只介绍了本地化操作的 增删查操作、至于修改操作,则和增操作大体类似,通过传入的本地数据id,来将新的数据替换掉旧的数据即可

例子:

var res = await _stepTaskDb.update(StepTasks(id:v['id'], stepListType:'process', stepListData:dataBase['listData'], stepDataDetails:dataBase['listDetails']));

目前为止,应该将最基本的增删改查操作介绍完了,并且附上了例子,如果不出大问题的话,大家应该可以达到本地化数据的操作,有问题请下方留言联系我~

Flutter 本地数据库sqflite实战操作相关推荐

  1. Flutter 5 大本地数据库解决方案

    Flutter 5 大本地数据库解决方案 原文 https://levelup.gitconnected.com/top-5-local-database-solutions-for-flutter- ...

  2. android读取excel数据库,Android 读取Excel数据并保存在本地数据库

    在工作中遇到需要将Excel的数据读取出来并保存在本地数据库中的操作,数据如下: 图片.png 需要做以下准备: 读取Excel的jar包[文章末尾会分享该jar包] 保存数据的数据库框架,在这里我们 ...

  3. Windows Phone本地数据库(SQLCE):5、[Association]attribute(翻译)(转)

    这是"windows phone mango本地数据库(sqlce)"系列短片文章的第五篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将覆 ...

  4. Windows Phone开发(48):不可或缺的本地数据库

    原文:Windows Phone开发(48):不可或缺的本地数据库 也许WP7的时候,是想着让云服务露两手,故似乎并不支持本地数据库,所有数据都上传上"云"数据库中.不过呢,在SD ...

  5. 如何将本地数据库迁移到数据库上?

    使用数据传输服务(DTS)将本地数据库迁移到 阿里云的云数据库RDS,可以实现应用不停服务的情况下,平滑完成数据库的迁移工作.接下来我们将学习下如何使用DTS将本地数据库迁移到RDS上. 背景 DTS ...

  6. Windows Phone本地数据库(SQLCE):11、使用LINQ查询数据库(翻译) (转)

    这是"windows phone mango本地数据库(sqlce)"系列短片文章的第十一篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将 ...

  7. HTML5权威指南--Web Storage,本地数据库,本地缓存API,Web Sockets API,Geolocation API(简要学习笔记二)...

    1.Web Storage HTML5除了Canvas元素之外,还有一个非常重要的功能那就是客户端本地保存数据的Web Storage功能. 以前都是用cookies保存用户名等简单信息. 但是coo ...

  8. WPF技术触屏上的应用系列(二): 嵌入百度地图、API调用及结合本地数据库在地图上进行自定义标点的实现...

    原文:WPF技术触屏上的应用系列(二): 嵌入百度地图.API调用及结合本地数据库在地图上进行自定义标点的实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系 ...

  9. 基于html的数据库,基于HTML5的本地数据库与服务端数据库的协同研究

    摘要: Web应用特别是移动Web应用已深入到人们生活.工作中,成为不可缺失的一部分.源于跨操作系统平台实现的便捷,当前基于智能手机.平板和手持移动终端的浏览器前端应用在快速增长.然而在间歇的网络可用 ...

  10. 错误解决记录------------mysql连接本地数据库显示can't get hostname for your address

    mysql连接本地数据库遇到 can't get hostname for your address 不明原因的本地mysql数据库连接不上,总是显示can't get hostname for yo ...

最新文章

  1. 【比赛】论如何七天内在研究生电子设计竞赛中拿国奖
  2. 14_pytorch.where,pytorch.gather
  3. 将Windows MyEclipse的web项目移植到Debian下
  4. 《CLR via C#》读书笔记 之 基元类型、引用类型和值类型
  5. 历史上有过哪些有名的神级显卡?
  6. 实战 | F1060路由模式典型组网配置案例(RIP)
  7. EEPROM AT24C08的操作
  8. 双专线接入H3C防火墙无法远程到设备
  9. iOS 打开扬声器以及插入耳机的操作
  10. jdk 配置出错could not open `C:\Java\jdk16\lib\amd64\jvm.cfg‘ 解决方案
  11. 给个华为服务器账号和密码忘了怎么办啊,华为帐号密码忘了怎么办?华为帐号找回密码教程...
  12. 矢量网络分析仪是什么?矢量网络分析仪的组成
  13. 下载scikit_learn
  14. 淘特 Flutter 流畅度优化实践
  15. PHP变量说法不正常是,关于PHP变量的说法中正确的是(? ?)。
  16. table 表格合并行或列
  17. 第三章 - 有穷自动机与词法分析(二)
  18. Optisystem7.0安装教程(Win10系统)
  19. gcc posix sjij for MSYS 9.2.1+
  20. 和ts一般怎么玩_TS夺冠后马上卖席位?微博电竞和其互关,以后热搜不愁了

热门文章

  1. JavaScript注释
  2. BT下载4K电影、视频
  3. [4K测试视频] 杜比4K UHD蓝光演示碟 Dolby.UHD.BluRay.Demo.Disc.March.2018.2160p.BluRay下载
  4. HDU1527——取石子游戏(威佐夫博弈)
  5. mysql 数据库修改ip_mysql数据库学习之修改主库ip地址
  6. AMOS分析技术:软件安装及菜单功能介绍;这次是视频教程
  7. 大数据时代,我竟然在用Excel和SPSS做数据分析,真香!
  8. C# 利用iTextSharp画PDF
  9. 计算机硬盘介绍,硬盘简介 - 硬盘使用知识大全(1)
  10. vs2012 安装 InstallShield