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

Flutter笔记: 在Flutter应用中使用SQLite数据库

Flutter笔记
在Flutter应用中使用SQLite数据库(基于sqflite)

作者李俊才 (jcLee95):https://blog.csdn.net/qq_28550263
邮箱 :291148484@163.com
本文地址:https://blog.csdn.net/qq_28550263/article/details/134451075

【简介】本文旨在介绍在 Flutter 中通过 sqflite 模块使用 SQLite 数据库。



1. 概述

SQLite是一种轻量级的嵌入式关系型数据库管理系统,而在Flutter中,我们可以通过使用 sqflite 模块方便地进行SQLite数据库的操作。本文将介绍如何在Flutter应用中使用 sqflite 来进行数据库操作。如果你对ORM(对象关系映射)有兴趣,可以参考以下文章:

  • 《在 Floor (ORM框架)中自动生成数据库代码》:https://jclee95.blog.csdn.net/article/details/134356076#4
  • 《用于ORM的Floor框架》:https://jclee95.blog.csdn.net/article/details/133377191
  • 《Dart笔记:一些代码生成工具站点的介绍》:https://jclee95.blog.csdn.net/article/details/134349100

在接下来的内容中,我们将深入了解如何使用 sqflite 在Flutter应用中创建、查询、更新和删除数据库记录,以及如何执行异步操作和处理数据库版本升级。

2. 安装和配置 sqflite

在使用 sqflite 之前,我们需要将其添加为Flutter应用的依赖项,并在代码中导入相应的模块。

2.1 添加依赖

打开你的Flutter应用的 pubspec.yaml 文件,并在 dependencies 部分添加 sqflite 依赖:

dependencies:sqflite: ^2.3.0

这将使用指定版本的 sqflite 库。你可以通过 pub.dev 查看最新版本。

保存 pubspec.yaml 文件后,运行以下命令来获取依赖:

flutter pub get

如果你想直接安装最新版本亦可以通过运行下面的命令:

flutter pub add sqflite

这将在 pubspec.yaml 文件中添加最新版本作为依赖,并隐式的运行一个 flutter pub get 命令。

2.2 导入模块

在你的Dart文件中,导入 sqflite 模块:

import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';// 其他导入...

以上是在Flutter应用中添加和配置 sqflite 的步骤。在接下来的部分,我们将深入研究如何使用 sqflite 进行数据库操作。

3. SQL 基础知识 和 SQLite 工具

3.1 创建表

在SQL中,我们使用CREATE TABLE语句来创建新的表。以下是创建表的示例代码:

CREATE TABLE my_table(id INTEGER PRIMARY KEY,name TEXT
);

在上面的SQL语句中,我们创建了一个名为my_table的表,它有两个字段:id和name。id字段是整数类型,并作为主键,name字段是文本类型。

3.2 插入数据

在上面的SQL语句中,我们使用INSERT INTO语句来插入新的数据。以下是插入数据的示例代码:

INSERT INTO my_table(id, name) VALUES(1, 'Jack');

在上面的SQL语句中,我们向my_table表插入了一条新的数据,id字段的值为1,name字段的值为’Jack’。

3.3 查询数据

在SQL中,我们使用SELECT语句来查询数据。以下是查询所有数据的示例代码:

SELECT * FROM my_table;

在上面的SQL语句中,我们查询了my_table表的所有数据。

3.4 更新数据

在SQL中,我们使用UPDATE语句来更新数据。以下是更新数据的示例代码:

UPDATE my_table SET name = 'Bob' WHERE id = 1;

在上面的SQL语句中,我们更新了my_table表中id字段为1的数据,将name字段的值改为’Bob’。

3.5 删除数据

在SQL中,我们使用DELETE FROM语句来删除数据。以下是删除数据的示例代码:

DELETE FROM my_table WHERE id = 1;

在上面的SQL语句中,我们删除了my_table表中id字段为1的数据。

3.6 数据库工具

SQLiteSpy 工具

SQLiteSpy 是一款免费的快速且紧凑的图形用户界面(GUI)工具,用于管理 SQLite 数据库,你可以自由地下载和使用。它的设计目标是使得 SQLite 数据库的开发和维护变得更加简单和轻松。SQLiteSpy 提供了丰富的功能,包括数据库结构查看、SQL 查询编辑器、数据导入/导出等。它还支持 SQLite 的所有数据类型,包括 BLOB。

下载地址:https://download.csdn.net/download/qq_28550263/88545032

在这里插入图片描述

在 Windows 上调试运行 Flutter 时,数据库文件位置在 项目根目录.dart_tool\sqflite_common_ffi\databases
在这里插入图片描述

Android Studio

可以可以在插件市场搜索一个你喜欢的SQLite插件:
在这里插入图片描述
然后打开 设备文件浏览器
在这里插入图片描述

然后在应用下找到数据库文件。

如果使用 Floor 的话,数据库时自动创建的。假设你的应用的包名是 my_app,那么你的应用的数据库文件应该位于 /data/data/com.example.my_app/databases/ 目录下。
在这里插入图片描述
双击后,数据库插件将在新的标签中打开:

在这里插入图片描述
(此处演示的表是空的,但是可以看到表的各个字段)

4. 创建数据库

4.1 定义数据库路径

首先,我们需要定义数据库文件的路径。在 AndroidiOS 上,我们通常将数据库文件存储在设备的文件系统中。我们可以使用 path_provider 库来获取这些路径。

首先,添加 path_provider 依赖到你的 pubspec.yaml 文件:

dependencies:flutter:sdk: fluttersqflite: anypath_provider: any

然后,导入path_provider和sqflite库,并定义一个函数来获取数据库路径:

import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
import 'dart:io' as io;
import 'package:path/path.dart';// 定义一个异步函数来获取数据库路径
Future<String> getDatabasePath(String dbName) async {// 获取应用的文档目录final directory = await getApplicationDocumentsDirectory();// 拼接路径final path = join(directory.path, dbName);return path;
}

作为对比,以前介绍过 Floor 库。Floor 是一个基于 SQLiteORM 框架,它在底层使用了 sqflite 库。但是,Floor 框架已经封装了数据库路径的获取和数据库的创建,所以在使用 Floor 框架时,你不需要显式地使用 path_provider 库来获取数据库路径。
当你使用 Floor 框架创建数据库时,只需要提供数据库的名称,Floor 框架会自动为你处理数据库路径的问题。例如:

final database = await $FloorAppDatabase.databaseBuilder('app_database.db').build();

4.2 创建数据库表

有了数据库路径,我们就可以创建数据库和表了。我们可以定义一个函数来创建数据库和表:

Future<Database> createDatabase() async {// 获取数据库路径final path = await getDatabasePath('my_db.db');// 打开数据库final database = openDatabase(path,version: 1,// 当数据库第一次被创建时,执行创建表的操作onCreate: (db, version) {return db.execute("CREATE TABLE my_table(id INTEGER PRIMARY KEY, name TEXT)",);},);return database;
}

在上述代码中,我们首先调用openDatabase函数并传入数据库路径。如果数据库文件不存在,openDatabase函数会创建一个新的数据库文件。然后,我们定义了一个onCreate回调函数,当数据库第一次被创建时,这个函数会被调用。在这个函数中,我们执行了一个SQL语句来创建一个新的表my_table。

5. 插入数据

5.1 创建数据模型

在插入数据之前,我们通常会创建一个数据模型来表示我们的数据。以下是一个简单的数据模型示例:

class MyData {final int id;final String name;// 构造函数MyData({required this.id, required this.name});// 将MyData对象转换为MapMap<String, dynamic> toMap() {return {'id': id,'name': name,};}
}

在上述代码中,我们定义了一个MyData类,它有两个字段:id和name。我们还定义了一个toMap方法,它将MyData对象转换为一个Map,这样我们就可以将它插入到数据库中。

5.2 插入数据记录

有了数据模型,我们就可以插入数据到数据库中了。以下是插入数据的示例代码:

Future<void> insertData(MyData data, Database db) async {try {// 插入数据到数据库await db.insert('my_table',data.toMap(),// 如果插入的数据与已有数据冲突(例如,两个数据有相同的主键),则替换旧数据conflictAlgorithm: ConflictAlgorithm.replace,);} catch (e) {// 打印错误信息print('Failed to insert data: $e');}
}

在上述代码中,我们定义了一个insertData函数,它接受一个MyData对象和一个Database对象。我们调用db.insert方法来插入数据。我们传入表名my_table,以及通过data.toMap()得到的Map。如果插入的数据与已有数据冲突(例如,两个数据有相同的主键),我们选择替换旧数据,这是通过设置conflictAlgorithm为ConflictAlgorithm.replace实现的。

6. 查询数据

6.1 执行查询操作

在sqflite中,我们可以使用query方法来执行查询操作。以下是查询所有数据的示例代码:

Future<List<Map<String, dynamic>>> queryAll(Database db) async {// 查询所有数据return await db.query('my_table');
}

在上述代码中,我们定义了一个queryAll函数,它接受一个Database对象,并返回一个包含所有数据的列表。我们调用db.query方法并传入表名my_table来查询所有数据。

6.2 处理查询结果

查询结果是一个Map的列表,每个Map代表一条数据记录。我们可以将这些Map转换为我们的数据模型。以下是处理查询结果的示例代码:

Future<List<MyData>> getMyDataFromDB(Database db) async {// 获取所有数据final List<Map<String, dynamic>> maps = await queryAll(db);// 将Map转换为MyData对象return List.generate(maps.length, (i) {return MyData(id: maps[i]['id'],name: maps[i]['name'],);});
}

在上述代码中,我们定义了一个getMyDataFromDB函数,它接受一个Database对象,并返回一个MyData对象的列表。我们首先调用queryAll函数来获取所有数据,然后使用List.generate方法来生成一个MyData对象的列表。在生成列表的过程中,我们从每个Map中获取id和name字段,并创建一个新的MyData对象。

7. 更新数据

7.1 更新数据记录

在sqflite中,我们可以使用update方法来更新数据。以下是更新数据的示例代码:

Future<void> updateData(MyData data, Database db) async {// 更新数据await db.update('my_table',data.toMap(),// 指定哪些记录应该被更新where: "id = ?",whereArgs: [data.id],);
}

在上述代码中,我们定义了一个updateData函数,它接受一个MyData对象和一个Database对象。我们调用db.update方法来更新数据。我们传入表名my_table,以及通过data.toMap()得到的Map。我们还指定了where和whereArgs参数,以确定哪些记录应该被更新。在这个例子中,我们更新id字段等于data.id的记录。

7.2 验证更新结果

为了验证数据是否已经被更新,我们可以再次查询数据,并检查数据是否符合预期。以下是验证更新结果的示例代码:

Future<void> verifyUpdate(MyData data, Database db) async {// 从数据库中获取所有数据List<MyData> dataList = await getMyDataFromDB(db);// 遍历数据列表for (var item in dataList) {// 如果找到id与待验证数据id相同的数据项if (item.id == data.id) {// 断言其name字段与待验证数据的name字段相同assert(item.name == data.name);}}
}

在上述代码中,我们定义了一个verifyUpdate函数,它接受一个MyData对象和一个Database对象。我们首先调用getMyDataFromDB函数来获取所有数据,然后遍历数据列表,找到id字段等于data.id的记录,并检查其name字段是否等于data.name。如果等于,那么说明更新操作成功。

8. 删除数据

8.1 删除数据记录

在sqflite中,我们可以使用delete方法来删除数据。以下是删除数据的示例代码:

Future<void> deleteData(int id, Database db) async {// 调用delete方法删除指定id的数据await db.delete('my_table',// where子句用于指定要删除的数据where: "id = ?",whereArgs: [id],);
}

在上述代码中,我们定义了一个deleteData函数,它接受一个id和一个Database对象。我们调用db.delete方法来删除数据。我们传入表名my_table,并指定where和whereArgs参数,以确定哪些记录应该被删除。在这个例子中,我们删除id字段等于给定id的记录。

8.2 验证删除结果

为了验证数据是否已经被删除,我们可以再次查询数据,并检查数据是否符合预期。以下是验证删除结果的示例代码:

Future<void> verifyDelete(int id, Database db) async {// 从数据库中获取所有数据List<MyData> dataList = await getMyDataFromDB(db);// 遍历数据列表for (var item in dataList) {// 断言每个数据项的id都不等于已删除的数据idassert(item.id != id);}
}

在上述代码中,我们定义了一个verifyDelete函数,它接受一个id和一个Database对象。我们首先调用getMyDataFromDB函数来获取所有数据,然后遍历数据列表,检查每个记录的id字段是否不等于给定的id。如果所有记录的id字段都不等于给定的id,那么说明删除操作成功。

9. 数据库版本升级

随着应用的发展,我们可能需要修改数据库的结构,例如添加新的表或修改现有的表。这就需要升级数据库版本。在sqflite中,我们可以在打开数据库时指定版本号,并提供一个onUpgrade回调函数来处理数据库升级。

9.1 定义新的数据库版本

以下是定义新的数据库版本的示例代码:

Future<Database> createDatabase() async {// 获取数据库路径final path = await getDatabasePath('my_db.db');// 打开数据库,指定新的版本号final database = openDatabase(path,version: 2, // 新的版本号onCreate: (db, version) {return db.execute("CREATE TABLE my_table(id INTEGER PRIMARY KEY, name TEXT)",);},// 当数据库版本升级时,执行数据库升级操作onUpgrade: (db, oldVersion, newVersion) {// 处理数据库升级...},);return database;
}

在上述代码中,我们在openDatabase函数中指定了新的版本号。我们还提供了一个onUpgrade回调函数,当数据库版本升级时,这个函数会被调用。

9.2 执行数据库升级操作

以下是执行数据库升级操作的示例代码:

Future<Database> createDatabase() async {try {// 获取数据库路径final path = await getDatabasePath('my_db.db');// 打开数据库,指定新的版本号final database = openDatabase(path,version: 2,onCreate: (db, version) {// 创建表return db.execute("CREATE TABLE my_table(id INTEGER PRIMARY KEY, name TEXT)",);},// 当数据库版本升级时,执行数据库升级操作onUpgrade: (db, oldVersion, newVersion) {// 如果旧版本号小于2,为my_table表添加一个新的列ageif (oldVersion < 2) {// 执行SQL语句,修改my_table表,添加新的列agedb.execute("ALTER TABLE my_table ADD COLUMN age INTEGER");}},);// 返回数据库实例return database;} catch (e) {// 打印错误信息print('Failed to open database: $e');// 抛出异常throw e;}
}

在上述代码中,我们在onUpgrade回调函数中执行了一个SQL语句来修改my_table表,添加了一个新的列age。我们只在旧版本号小于2时执行这个操作,这是因为如果用户已经在版本2或更高版本的数据库中,那么age列已经存在,无需再次添加。

相关文章:

Flutter笔记: 在Flutter应用中使用SQLite数据库

Flutter笔记 在Flutter应用中使用SQLite数据库&#xff08;基于sqflite&#xff09; 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/q…...

OpenAI GPT5计划泄露

OpenAI的首席执行官萨姆奥特曼在最近接受《金融时报》的专访时&#xff0c;分享了OpenAI未来发展的一些新动向。此外&#xff0c;他还透露了关于即将到来的GPT-5模型以及公司对AGI的长期目标的一些细节。 奥特曼指出&#xff1a; 1.OpenAI正在开发GPT-5&#xff0c;一种更先进的…...

【面试经典150 | 数学】Pow(x, n)

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;快速幂-递归方法二&#xff1a;快速幂-迭代 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主…...

封装比较好的登录页面

封装比较好的登录页面 只在setup()函数中写流程&#xff0c;将逻辑代码抽离出来 <template><div class"wrapper"><img class"wrapper__img" srchttp://www.dell-lee.com/imgs/vue3/user.png /><div class"wrapper__input"&…...

如何使用Flask request对象处理请求

在 Flask 中&#xff0c;request 对象是处理 HTTP 请求的重要工具之一。它提供了许多属性和方法&#xff0c;可以帮助我们获取请求的相关信息和数据。本文将向你介绍 request 对象的常用方法以及如何在 Flask 应用程序中使用它。 1. 获取请求方法 首先&#xff0c;让我们看一…...

快速搜索多个word、excel等文件中内容

如何快速搜索多个word、excel等文件中内容 操作方法 以win11系统为介绍对象。 首先我们打开“我的电脑”-->“文件夹选项”-->“搜索”标签页,在“搜索内容”下方选择&#xff1a;"始终搜索文件名和内容&#xff08;此过程可能需要几分钟&#xff09;"。然后…...

Minio安装

环境 centos8&#xff0c;关闭防火墙 minio-20231101183725版本 参考官网&#xff1a;部署 MinIO&#xff1a;单节点单硬盘 — 适用于 Linux 的 MinIO 对象存储 单例 下载rpm&#xff0c;用中国镜像 wget https://dl.minio.org.cn/server/minio/release/linux-amd64/arch…...

Spring初识

未来的几周时间&#xff0c;大概率我会更新一下Spring家族的一些简单知识。而什么是Spring家族&#xff0c;好多同学还不是很清楚&#xff0c;我先来简单介绍一下吧&#xff1a; 所谓Spring家族&#xff0c;它其实就是一个框架&#xff0c;是基于Servlet再次进行封装的内容。为…...

2023全新付费进群系统源码 带定位完整版 附教程

这源码是我付费花钱买的分享给大家&#xff0c;功能完整。 搭建教程 Nginx1.2 PHP5.6-7.2均可 最好是7.2 第一步上传文件程序到网站根目录解压 第二步导入数据库&#xff08;58soho.cn.sql&#xff09; 第三步修改/config/database.php里面的数据库地址 第四步修改/conf…...

C# LINQ使用介绍

LINQ&#xff08;Language-Integrated Query&#xff09;是C#语言的一个强大特性&#xff0c;它允许开发者用声明性的方式查询和操作数据。LINQ提供了一致的查询体验&#xff0c;无论是操作内存中的对象&#xff08;如数组或集合&#xff09;&#xff0c;还是操作外部数据源&am…...

【c++】——类和对象(中)——实现完整的日期类(优化)万字详细解疑答惑

作者:chlorine 专栏:c专栏 赋值运算符重载()()():实现完整的日期类(上) 我走的很慢&#xff0c;但我从不后退。 【学习目标】 日期(- - --)天数重载运算符 日期-日期 返回天数 对日期类函数进行优化(不符合常理的日期&#xff0c;负数&#xff0c;const成员)c中重载输入cin和输…...

开源与闭源:大模型时代的技术交融与商业平衡

一、开源和闭源的优劣势比较 1.1 开源 优势&#xff1a; 1.技术共享与吸引人才&#xff1a; 开源促进了技术共享&#xff0c;吸引了全球范围内的人才参与大模型的发展&#xff0c;形成了庞大的开发者社区。 2.推动创新&#xff1a; 开源模式鼓励开发者共同参与&#xff0c;推动…...

C#开发的OpenRA游戏之属性BodyOrientation(6)

C#开发的OpenRA游戏之属性BodyOrientation(6) 在顶层定义里会发现这个属性: ^SpriteActor: BodyOrientation: QuantizeFacingsFromSequence: RenderSprites: SpriteActor是用来定义角色的基本属性,它的第一个属性就是BodyOrientation,这个属性主要用来描述角色的身体的…...

Linux shell编程学习笔记27:tputs

除了stty命令&#xff0c;我们还可以使用tput命令来更改终端的参数和功能。 1 tput 命令的功能 tput 命令的主要功能有&#xff1a;移动更改光标、更改文本显示属性&#xff08;如颜色、下划线、粗体&#xff09;&#xff0c;清除屏幕特定区域等。 2 tput 命令格式 tput [选…...

【计算机网络笔记】IPv6简介

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…...

c语言-数据结构-堆

目录 一、二叉树 1、二叉树的概念 2、完全二叉树和满二叉树 3、完全二叉树的顺序存储 二、堆 2、堆的概念与结构 3、堆的创建及初始化 4、堆的插入&#xff08;小堆&#xff09; 5、堆的删除 6、显示堆顶元素 7、显示堆里的元素个数 8、测试堆的各个功能 9、 实现堆…...

ROS基础—关于参数服务器的操作

1、rosparam list 获取参数服务器的所有参数。 2、rosparam get /run_id 获取参数的值...

Sql Server 2017主从配置之:事务日志传送

使用事务日志传送模式搭建Sql Server 2017主从同步&#xff0c;该模式有一定的延迟&#xff0c;是通过3个不同的定时任务&#xff0c;将主库的日志同步到从库进行恢复来实现数据库同步操作。 环境准备 两台服务器&#xff0c;配置都是8g2核&#xff0c;50g硬盘&#xff0c;操…...

每日OJ题_算法_双指针_力扣283. 移动零+力扣1089. 复写零

力扣283. 移动零 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 难度 简单 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例…...

WebGl-Blender:建模 / 想象成形 / Blender概念词汇表 / 快捷键

一、理解Blender 欢迎来到Blender&#xff01;Blender是一款免费开源的3D创作套件。 使用Blender&#xff0c;您可以创建3D可视化效果&#xff0c;例如建模、静态图像&#xff0c;3D动画&#xff0c;VFX&#xff08;视觉特效&#xff09;快照和视频编辑。它非常适合那些受益于…...

【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能

仿射变换是一种二维变换&#xff0c;它可以将一个二维图形映射到另一个二维图形上&#xff0c;保持了图形的“形状”和“大小”不变&#xff0c;但可能会改变图形的方向和位置。仿射变换可以用一个线性变换矩阵来表示&#xff0c;该矩阵包含了六个参数&#xff0c;可以进行平移…...

WPF实现右键菜单

在WPF中&#xff0c;创建上下文菜单&#xff08;通常称为“右键菜单”&#xff09;是通过使用ContextMenu控件来实现的。你可以在XAML中声明上下文菜单&#xff0c;并将其关联到任何FrameworkElement。以下是如何在WPF中实现上下文菜单的基本步骤&#xff1a; 1. 在XAML中定义…...

Java智慧工地SaaS管理平台源码:AI/云计算/物联网

智慧工地是指运用信息化手段&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生态圈&#xff0c;并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析&#xff0c;提供过程趋势预测及专家预案&#xff0c;实现工程…...

【漏洞复现】通达oa 前台sql注入

漏洞描述 通达OA(Office Automation)是一款企业级协同办公软件,旨在为企业提供高效、便捷、安全、可控的办公环境。它涵盖了企业日常办公所需的各项功能,包括人事管理、财务管理、采购管理、销售管理、库存管理、生产管理、办公自动化等。通达OA支持PC端和移动端使用,可以…...

机器学习笔记 - Ocr识别中的文本检测EAST网络概述

一、文本检测 文本检测简单来说就是找到图像中可以出现文本的区域。例如,请参见下图,其中在检测到的文本周围绘制了绿色边框。 在进行文本检测时,你可能会遇到两种情况 具有结构化文本的图像:这是指具有干净/均匀背景和常规字体的图像。文本大多密集,行结构正确,…...

【SQL server】数据库、数据表的创建

创建数据库 --如果存在就删除 --所有的数据库都存在sys.databases当中 if exists(select * from sys.databases where name DBTEST)drop database DBTEST--创建数据库 else create database DBTEST on --数据文件 (nameDBTEST,--逻辑名称 字符串用单引号filenameD:\DATA\DBT…...

vue的生命周期分别是什么?

Vue的生命周期分为8个阶段&#xff0c;分别是&#xff1a; beforeCreate&#xff1a;实例初始化之后&#xff0c;数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 created&#xff1a;实例已经创建完成后被调用&#xff0c;这时候实例已完成以下的配置&#…...

Java拼图游戏

运行出的游戏界面如下&#xff1a; 按住A不松开&#xff0c;显示完整图片&#xff1b;松开A显示随机打乱的图片。 User类 package domain;/*** ClassName: User* Author: Kox* Data: 2023/2/2* Sketch:*/ public class User {private String username;private String password…...

Vue框架的element组件table文字居中

1.直接上代码 <el-table max-height"500px" :data"datas.roles" style"width: 100%" border :header-cell-style"{textAlign: center}" :cell-style"{ textAlign: center }"><el-table-column prop"id" …...

科技创新 共铸典范 | 江西卫健办邓敏、飞图影像董事长洪诗诗一行到访拓世科技集团,提振公共卫生事业发展

2023年11月15日&#xff0c;拓世科技集团总部迎来了江西省卫健项目办项目负责人邓敏、江西飞图影像科技有限公司董事长洪诗诗一行的考察参观&#xff0c;集团董事长李火亮、集团高级副总裁方高强进行热情接待。此次多方交流&#xff0c;旨在共同探讨携手合作&#xff0c;激发科…...

Linux安装OpenCV并配置VSCode环境

Linux安装OpenCV并配置VSCode环境 安装OpenCV环境安装必需工具下载并解压OpenCV库&#xff08;Opencv Core Modules和opencv_contrib&#xff09;创建构建目录&#xff0c;进行构建验证构建结果安装验证安装结果 配置VSCode环境创建项目文件修改配置信息执行程序 安装环境 Ubun…...

Django(ORM事务操作|ORM常见字段类型|ORM常见字段参数|关系字段|Meta元信息)

文章目录 ORM事务操作什么是事务&#xff1f;事务的产生事务的四大特征ORM中如何使用事务 ORM字段类型常用字段与不常用字段类型ORM还支持用户自定义字段类型 ORM字段参数关系字段ForeignKey外键on_delete参数设置的值 OneToOneField与ForeignKey的区别多对多关系建立的方式ORM…...

【mujoco】Ubuntu20.04配置mujoco210

【mujoco】Ubuntu20.04配置mujoco210 文章目录 【mujoco】Ubuntu20.04配置mujoco2101. 安装mujoco2102. 安装mujoco-py3.使用render时报错Reference 本文简要介绍一下如何在ubuntu20.04系统中配置mujoco210&#xff0c;用于强化学习。 1. 安装mujoco210 在官方资源里找到http…...

【洛谷 P3853】[TJOI2007] 路标设置 题解(二分答案+循环)

[TJOI2007] 路标设置 题目背景 B 市和 T 市之间有一条长长的高速公路&#xff0c;这条公路的某些地方设有路标&#xff0c;但是大家都感觉路标设得太少了&#xff0c;相邻两个路标之间往往隔着相当长的一段距离。为了便于研究这个问题&#xff0c;我们把公路上相邻路标的最大…...

蓝桥杯 vector

vector的定义和特性 注意&#xff1a;vector需要开C11标准 vector的常用函数 push_back():将元素添加到vector末尾 pop_back():删除vector末尾的元素 begin()和end():返回指向vector第一个元素和最后一个元素之后一个位置的迭代器。 示例 vector<int> vec{10,20,30};f…...

ai绘画部署教程

在部署AI绘画Web环境的过程中&#xff0c;你提供了一些关键步骤。以下是一些详细说明&#xff1a; 1. 克隆webui 首先&#xff0c;通过以下命令从GitHub上克隆webui的代码&#xff1a; git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 这将下载webui的源…...

策略模式的应用——应对频繁的需求变更

秋招结束后&#xff0c;间接性堕落了一段时间&#xff0c;学习几乎停止下来了。内心甚是焦灼&#xff0c;感觉生活很无趣&#xff01;为了在参加工作后能够快速上手和成为一名优秀的中级开发者&#xff0c;从这篇文章开始将不断学习优秀的编码经验&#xff0c;学习是永无止境的…...

qt-C++笔记之treeWidget初次使用

qt-C笔记之treeWidget初次使用 code review! 文章目录 qt-C笔记之treeWidget初次使用1.运行2.文件结构3.main.cpp4.widget.h5.widget.cpp6.widget.ui7.main.qrc8.qt_widget_test.pro9.options.png 1.运行 2.文件结构 3.main.cpp 代码 #include "widget.h"#include…...

SQL零基础入门教程,贼拉详细!贼拉简单! 速通数据库期末考!(八)

FULL OUTER JOIN 除了前面讲到的 INNER JOIN&#xff08;内连接&#xff09;、LEFT JOIN&#xff08;左连接&#xff09;、RIGHT JOIN&#xff08;右连接&#xff09;&#xff0c;还有另外一种关联方式&#xff0c;即 FULL OUTER JOIN&#xff08;全外连接&#xff09; FULL O…...

C语言编程陷阱(八)

陷阱36:不要使用指针作为函数的返回值 有时候,我们可能想要用一个函数来返回一个指针,比如返回一个动态分配的内存,或者返回一个数组的某个元素的地址。但是,如果我们不小心,我们可能会犯一个很常见的错误,就是返回一个局部变量的地址。例如,看看下面的代码: #inclu…...

客户端性能优化实践

背景 双十一大促时&#xff0c;客户客服那边反馈商品信息加载卡顿&#xff0c;在不断有订单咨询时&#xff0c;甚至出现了商品信息一直处于加载状态的情况&#xff0c;显然&#xff0c;在这种高峰期接待客户时&#xff0c;是没法进行正常的接待工作的。 起初&#xff0c;页面一…...

mysql使用--表达式和函数

1.表达式 如&#xff1a;11&#xff0c;一般包含操作数&#xff0c;运算符。 _1.操作数 MYSQL中最常用的操作数有以下几种 (1).常数 (2).列名&#xff0c;针对某个具体的表&#xff0c;它的列名可被当作表达式的一部分 (3).函数调用 一个函数用于完成某个特定的功能。比如NOW()…...

<蓝桥杯软件赛>零基础备赛20周--第6周--数组和队列

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…...

软件开发、网络空间安全、人工智能三个方向的就业和前景怎么样?哪个方向更值得学习?

软件开发、网络空间安全、人工智能这三个方向都是当前及未来的热门领域&#xff0c;每个领域都有各自的就业前景和价值&#xff0c;以下是对这三个方向的分析&#xff1a; 1、软件开发&#xff1a; 就业前景&#xff1a;随着信息化的加速&#xff0c;软件开发的需求日益增长。…...

新增文章分类

pojo.Category package com.lin.springboot01.pojo;import jakarta.validation.constraints.NotEmpty; import lombok.Data;import java.time.LocalDateTime;Data public class Category {private Integer id;//主键NotEmptyprivate String categoryName;//分类名称NotEmptypr…...

选硬币该用动态规划

选硬币&#xff1a; 现有面值分别为1角1分&#xff0c;5分&#xff0c;1分的硬币&#xff0c;请给出找1角5分钱的最佳方案。 #include <iostream> #include <vector>std::vector<int> findChange(int amount) {std::vector<int> coins {11, 5, 1}; /…...

LeetCode 2342. 数位和相等数对的最大和:哈希表

【LetMeFly】2342.数位和相等数对的最大和&#xff1a;哈希表 力扣题目链接&#xff1a;https://leetcode.cn/problems/max-sum-of-a-pair-with-equal-sum-of-digits/ 给你一个下标从 0 开始的数组 nums &#xff0c;数组中的元素都是 正 整数。请你选出两个下标 i 和 j&…...

Vulkan渲染引擎开发教程 一、开发环境搭建

一 安装 Vulkan SDK Vulkan SDK 就是我们要搞的图形接口 首先到官网下载SDK并安装 https://vulkan.lunarg.com/sdk/home 二 安装 GLFW 窗口库 GLFW是个跨平台的小型窗口库&#xff0c;也就是显示窗口&#xff0c;图形的载体 去主页下载并安装&#xff0c;https://www.glfw.…...

(带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程

源码简介&#xff1a; 1、会员管理&#xff1a; 该系统分为三个级别的会员流程&#xff1a;总站管理员、代理与会员&#xff08;会员有普通会员、中级会员和高级会员三个等级&#xff09;。总站管理员可以添加代理用户并为其充值余额&#xff0c;代理用户可以为普通用户充值余…...

IDEA 快捷键汇总

目录 1、altinsert 2、ctrl/ 3、altenter 4、alt回车 5、ctrlD 6、ctrlaltL 7、ctrl点击 8、alt左键向下拉 9、ctrlaltv 10、ctrlaltwint 1、altinsert 快速创建代码&#xff0c;可以快速创建类中get set tostring等方法 2、ctrl/ 单行注释 3、altenter…...