【Flutter 3-4】Flutter进阶教程——数据持久化sqflite使用

2023-10-28

作者 | 弗拉德
来源 | 弗拉德(公众号:fulade_me)

sqflite

数据持久化是在移动端开发中必不可少的技术手段。我们总是有一些用户信息,应用资源,列表数据等需要存储起来,这里我们主要来讲基于SQLite数据库的数据储存。
SQLite,是一款轻型的数据库。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。更多详细信息可以参考:维基百科百度百科
Flutter已经帮助我们封装了操作SQLite的库,它就是:sqflite

集成sqflite库

使用sqflite第三方库需要我们在pubspec.yaml文件先添加库的名字和版本号
dependencies字段下添加:

sqflite: ^1.1.3

这里以1.1.3为例
添加完成后保存一下,VSCode默认会执行pub get帮我们把需要的库下载下来,同样我们也可以在项目根目录下执行pub get来手动拉取需要的库。

1. 创建本地数据文件

static Future<SqfliteManager> _initDataBase() async {
SqfliteManager manager = SqfliteManager();
String dbPath = await getDatabasesPath() + "/$sqlName";
if (manager.db == null) {
    manager.db = await openDatabase(
    dbPath,
    version: 1,
    onCreate: (db, version) async {
        /// 如果不存在 当前的表 就创建需要的表
        if (await manager.isTableExit(db, tableName) == false) {
        await db.execute(CREATE_DATA_TABLE);
        }
    },
    );
}
return manager;
}

首先我们通过getDatabasesPath()函数获取到本地保存数据库文件的路径,在此路径后面拼接上我们的数据库文件名字,就是保存数据库文件的路径。在iOS中该路径在沙河路径下的Documents文件夹内,在Android中时默认数据库目录。
之后我们声明一个Database对象,用来保存数据库操作对象

Database db;

先判断此对象是否存在,如果不存在我们调用openDatabase来创建
这里传入前面获取到的数据库地址,版本号,和onCreate回调函数。
onCreate回调内部判断是否存在我们需要使用的表名字,如果不存就执行创建数据库表的sql语句。

除了onCreate回调,还有onUpgradeonDowngradeonOpen等回调。另外一个参数singleInstance它表示当传入相同的数据库路径是否返回同一个的实例对象,默认是true

2. 插入数据

鉴于sqflite帮我们做了很多工作,所以在使用基本的也很简单

  /// 插入数据
  Future<int> insertData(Map<String, dynamic> value) async {
    return await db.insert(tableName, value);
  }

只需要传入表名字和要插入的数据就行
我们再来看一下insert函数的其他参数

Future<int> insert(String table, Map<String, dynamic> values,
      {String nullColumnHack, ConflictAlgorithm conflictAlgorithm});
  • nullColumnHack 是在传入的插入数据是空的时候 起到作用的
    如果插入数据为空:
    若不添加nullColumnHack则sql语句最终的结果将会类似insert into tableName()values(),这是不允许的。
    若添加上nullColumnHack则sql语句将会变成insert into tableName (nullColumnHack)values(null),这是可以的。
  • conflictAlgorithm 是一个枚举,当插入的数据出现冲突或错误时,我们该使用哪种策略,有以下几个值
enum ConflictAlgorithm {
  rollback,
  abort,
  fail,
  ignore,
  replace,
}

3. 删除数据

删除数据的代码如下

  /// 删除一条数据
Future<int> deleteData(int id) async {
    return await db.delete(tableName, where: "id = ?", whereArgs: [id]);
}

来看一下详细的delete函数都有哪些参数:

Future<int> delete(String table, {String where, List<dynamic> whereArgs});
  • table是要删除数据所在的表的名字 例如:testTable
  • where是一个字符串,表示的是要删除的表达语句 例如:“id = ?”
  • whereArgs是一个数组,是用来补充where语句里面的?参数的 例如:[2]
    当我们传入上面示例参数后,要标的意思就是:要删除testTable 表内 id = 2 的数据

4. 更新数据

删除数据代码如下

Future<int> updateData(Map<String, dynamic> value, int id) async {
    return await db.update(
        tableName,
        value,
        where: "id = ?",
        whereArgs: [id],
    );
}

详细的update函数如下

Future<int> update(String table, Map<String, dynamic> values,
      {String where,
      List<dynamic> whereArgs,
      ConflictAlgorithm conflictAlgorithm});

insert函数的参数基本一致,这里就不赘述了

5. 查询数据

直接来看查询语句的参数

Future<List<Map<String, dynamic>>> query(
    String table,  /// 表名字 是必传参数
    {bool distinct,  // 是否包含重复数据
    List<String> columns,  // 需要查询的列
    String where,       //  查询条件
    List<dynamic> whereArgs, // 查询条件参数
    String groupBy,  //按列分组 列的名字
    String having,   // 给分组设置条件
    String orderBy,   // 按列排序 asc/desc
    int limit,     // 限制查询结果数量
    int offset});  // 从第几条开始查询

查询语句的参数比较丰富,基本可以满足我们一些复杂场景的查询需求

好了,关于sqflite的使用就总结这些了。

想体验以上的示例的运行效果,可以到我的Github仓库项目flutter_app->lib->routes->sqflite_page.dart查看,并且可以下载下来运行并体验。


公众号

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Flutter 3-4】Flutter进阶教程——数据持久化sqflite使用 的相关文章

  • 如何在flutter中绘制自定义形状卡片

    我只想创建这样的卡片 代码如下 我用的是CustomPaint小部件绘制自定义形状 然后在内部使用堆栈Card正确放置小部件的小部件 我没有图像 所以将其更改为粉红色以显示图像 这是卡片小部件的代码 然后是CustomPainter cla
  • Flutter:防止抽屉关闭

    Flutter 中是否可以防止关闭抽屉 我在用endDrawer作为网络应用程序中的表单 我已禁用滑动打开功能 并且我还希望只允许通过按钮关闭它 这样用户就不会通过单击外部意外地关闭它 但是我看不到任何布尔值 例如防止解雇或任何实施方式Wi
  • 如何在flutter插件中调试iOS原生代码?

    我想知道如何在插件中调试 flutter iOS 代码 我可以打开每当您创建插件时生成的示例应用程序 但我将插件代码视为二进制框架 因此我无法调试它 对于 android 这相当简单 我只需打开 A S 中的 android 文件夹即可 插
  • 如何修复导致的错误:pub get failed(69)

    我在运行 Flutter 应用程序时遇到问题 酒吧失败 69 我尝试过使用firebase storage any and firebase storage 1 0 4 version 1 0 0 1 environment sdk gt
  • 如何在Flutter中为GridView中的Widget设置自定义高度?

    即使在指定 Container GridView 的高度之后 我的代码也会生成方形小部件 class MyHomePage extends StatefulWidget MyHomePage Key key this title super
  • FlutterJNI.loadLibrary 多次调用(FlutterJNI.prefetchDefaultFontManager、FlutterJNI.init)

    更新 Android Studio 和 flutter 和 kotlin 后 我收到此警告 错误 如何解决或者我可以忽略而不会导致错误 先感谢您 W FlutterJNI 23046 FlutterJNI loadLibrary calle
  • 未为“AudioCache”类型定义“play”方法

    问题 未为 AudioCache 类型定义 play 方法 导入 包 flutter material dart 导入 包 audioplayers src audio cache dart void main runApp Xylopho
  • Firebase云函数在Flutter中返回null,因为它仍在运行

    更新 我从我的 firebase 控制台得到这个 函数执行花费了 2906 毫秒 完成状态代码 200 15 秒后 我得到 console log DOC 确实存在 我正在运行这个云火库功能 它 有效 但我不断得到这样的回报 FLUTTER
  • Flutter textfield Flutter RTL光标位置问题n-1

    我不知道这个问题是否是老问题 但我尝试了所有方法都没有成功 在输入字段中选择字母 n 时出现的问题 光标跳转到 n 1 包含视频中显示的问题 仅在 RTL 中存在问题 该链接包含问题的代码和视频 代码 链接在这里 https github
  • 如何使用 SingleChildScrollView 使 Stacklayout 可滚动?

    我正在尝试使用 SingleChildScrollView 使堆栈布局可滚动 但它不滚动 这里应该使用SingleChildScrollView吗 我想我已经给出了足够的描述 可以让任何人理解我的问题 这里有更多文本以满足 StackOve
  • 在 flutter firebase 中登录时出现错误

    在使用错误的电子邮件或密码登录时 我希望获得我输入的小吃栏 但我的控制台中出现错误 error 初始任务操作失败 RecaptchaAction action signInWithPassword 有例外 内部 发生错误 无效的登录凭证 验
  • 对于哪些 flutter 小部件我们需要使用 const?

    我了解的好处const并且小部件不会在状态更改时重建 但当您看到下面的代码时 仍然很明显它们是常量 我希望 flutter 自动处理它 或者 flutter 已经在处理它而我却没有意识到 This makes sense to me but
  • 颤振文本小部件仅显示最后一个条目

    我正在尝试在 flutter 中创建日历 目前我正在实施这些活动 为了测试这一点 我创建了一个方法来检查当前日期 即创建行的时间 是否有事件 如果是这种情况 则会在表示内容的容器中打印 x 整个事情只是第一次测试 看它是否在原则上有效 当我
  • CustomPainter 使用 Listenable 重绘

    CustomPainter 类似乎有几种触发重绘的方法 我让我的画家使用 shouldRepaint 方法 但是 我希望我的画家对可监听中的更改做出反应 而不是轮询更改 Flutter 文档指出 触发重绘的最有效方法是 扩展此类并向 Cus
  • 没有为类型“Object”定义运算符“[]”。尝试定义运算符“[]”

    我的代码在下面给出了我在这一行中从 firebase 访问用户名时遇到的问题的错误 snapshot data username 它给出了上面提到的错误 我知道访问地图数据的唯一方法是这个 FutureBuilder future Fire
  • 是否可以在flutter中开发移动键盘应用程序

    我们想要开发具有一些独特功能 例如在键盘上翻译 的移动键盘应用程序 第三方键盘 我们想知道是否有一种方法可以同时为 IOS 和 Android 开发一次 使用 Flutter 或者其他解决方案 对此有一个长的和一个短的答案 简短的回答基本上
  • 渲染时 Flutter SVG 延迟

    我在行中显示 SVG 文件形式的图像和文本 由于某些原因 svg 图像的渲染速度比屏幕的其余部分慢 从而导致延迟 这不利于用户体验 这种延迟正常吗 我该怎么做才能使整个屏幕同时渲染 Row mainAxisAlignment MainAxi
  • 在 Flutter 中使用 Expansion Tile 和 ListView

    我正在尝试从此构建应用程序image https i stack imgur com gJNkO png 但是当我将 ListView 与此扩展图块放在同一页面中时 屏幕变为空 I added shrinkwrap true并工作了 但现在
  • 如何为发布而不是调试创建密钥库?扑

    我按照使用此网站部署 flutter 的步骤进行操作https flutter io android release https flutter io android release 当我运行 flutter build apk 时出现此错
  • 哪些 Flutter 插件或功能可以利用外部 iOS/Android 显示器来显示与主显示器不同的内容

    我正在构建一个跨平台应用程序 需要在外部显示器上显示不同的视图 通常通过连接到 LCD 投影仪的 HDMI 适配器电缆连接 Flutter 是否能够在内置的外部显示器上显示不同的屏幕 在现有的 Flutter 插件中还是使用现有的 Flut

随机推荐

  • java 中this的条件_在Java中,this用来代表( )的对象。_学小易找答案...

    填空题 Java语言中常用异常类IOException是用来处理 异常的类 单选题 下面关于继承的说法中正确的是 简答题 根据微课视频 制作函数 制作函数微课 wmv 填空题 Java发生异常状况的程序代码放在 语句块中 将要处理异常状况的
  • 对C++学习的反思(2023年5月23日)

    2023年5月23日 周二下午 存在的问题 至今仍然没用过C 的类来写项目 也不知道如何用C 的类来写项目 依然在用面向过程那套来写项目 不知道什么是面向对象编程 不知道为什么会有面向对象编程 不知道面向对象编程和面向过程相比有什么优势 那
  • rancher高可用安装

    kubernetes安装高可用rancher 需要安装helm 很简单自行安装即可 helm版本要求 本文使用的是已有的https证书 TLS证书 也可以用自建的 开始安装 一 添加helm rancher的仓库 请将命令中的
  • STM32F103的低功耗模式

    一 原理 STM32F103的低功耗模式有多种 常用的有STOP模式和STANDBY模式 这两种模式都可以有效降低芯片的功耗 特别是在电池供电的场景下 可以延长电池寿命 STOP模式 主要关闭CPU SRAM和Flash时钟 只保留少数必要
  • STM32一键下载电路程序下载后不运行问题分析

    使用STM32常用的下载方法主要有以下几种 1 ISP程序下载 使用STM32的串口1进行程序下载 使用该方式下载需要使用USB转串口芯片 常用的芯片如CH340G 该方式的程序下载需要使用上位机FlyMcu 上位机的设置出错很容易导致程序
  • mac 系统下通过docker 运行mysql

    mac 系统下通过docker 运行mysql 创建网络 mysql 安装 执行相关代码 配置参数 workspace docker mysql conf my cnf 启动 创建网络 docker network create dev n
  • Error creating bean with name ‘dataSource‘ Cannot load driver class: com.mysql.cj.jdbc.Driver

    最近写代码碰到一个关于jdbcTemplate的相关问题 因为项目的需求所以需要将程序打包成jar包去公司内网堡垒机运行 一直碰到一个与jdbcTemplate相关的问题 最后这个问题归结到 org springframework bean
  • 怎样制作网页

    制作网页可以通过以下步骤来完成 首先 你需要学习 HTML HyperText Markup Language 和 CSS Cascading Style Sheets 这两种编程语言 HTML 用来描述网页的结构和内容 CSS 用来控制网
  • 动态规划(钢条切割问题 Java/Python/Golang)

    问题描述 引用算法导论描述 给定一段长度为n英寸的钢条 一个整型 和一个价格表p 一个数组 求钢条最优切割方案 使得销售的收益最大 如果n英寸的钢条的价格p n 足够大 那么钢条有可能不需要切割 Java版本 原始版 原始求解方法 para
  • 细数【SD-WEBUI】的模型:谁是最适合的模型&从哪里找到它们

    文章目录 零 前言 一 基础模型 Stable Diffusion模型 1 1 ChilloutMix 仿真 1 2 BasilMix 仿真 1 3 BeautyProMix 仿真 1 4 ChikMix 仿真 1 5 Dalcefo Re
  • Java反序列化漏洞——jdbc反序列化漏洞利用

    漏洞原理 如果攻击者能够控制JDBC连接设置项 那么就可以通过设置其指向恶意MySQL服务器进行ObjectInputStream readObject 的反序列化攻击从而RCE 具体点说 就是通过JDBC连接MySQL服务端时 会有几个内
  • 一个大型网站需多少台服务器?

    首先要明白 这个问题不容易量化 影响一个大型网站所需服务器数量的因素很多 对于最基础的网站源代码 如果一个技术高超的程序员能实现最好的算法 那么几台服务器就能完成一个拥有数千万并发量的网站 相反 对于低水平的程序员来说 即使几十万台服务器也
  • 数据库系统基本论述

    一 常用术语及其基本概念 数据 data 描述事物的符号记录 数字 文字 图形 图像 音频 视频 数据库 DataBase DB 长期存储在计算机内 有组织的 可共享的大量数据的集合 数据库管理系统 DataBase Management
  • huggingface transformers包 文档学习笔记(持续更新ing...)

    诸神缄默不语 个人CSDN博文目录 本文系huggingface Hugging Face The AI community building the future 旗下Python包transformers 文档 Transformers
  • Sqlmap使用-盲注小实验

    目录 sqlmap简介 基本格式 sqlmap详细命令 Options 选项 Target 目标 Request 请求 Enumeration 枚举 Optimization 优化 Injection 注入 Detection 检测 Tec
  • QT的刷新机制,有时会不刷新的bug解决办法

    重写showEvent函数 void showEvent QShowEvent e this gt setAttribute Qt WA Mapped QWidget showEvent e
  • python学习——Python2与Python3共存

    上篇 https blog csdn net qq 42489308 article details 97644669 困扰 最近被一个问题困扰了很久 就是Python2和Python3共存pip的使用问题 本来是一个很简单的问题 但是我的
  • eureka 的几种主动下线服务的方式

    补充 在启动eureka服务的时候发现控制台有以下的输出 由此猜想可以通过改接口下线服务 于是尝试了一下 果然能从注册中心中移除该实例 1 直接停掉服务 默认情况下 如果Eureka Server在90秒没有收到Eureka客户的续约 它会
  • cs怎么联机,内外网p2p联机的实现

    cs是个一直HOP的游戏 笔者就是一个CS迷 CS局域网联机或许大家都会 如何内外网与外网联机游戏呢 如学校内网宿舍 与办公室基友 如何进行联机玩 可以利用nat123全端口映射p2p联机 在任何网络环境下实现跨网游戏联机 实现过程 1 在
  • 【Flutter 3-4】Flutter进阶教程——数据持久化sqflite使用

    作者 弗拉德 来源 弗拉德 公众号 fulade me sqflite 数据持久化是在移动端开发中必不可少的技术手段 我们总是有一些用户信息 应用资源 列表数据等需要存储起来 这里我们主要来讲基于SQLite数据库的数据储存 SQLite