前言:完全没接触过数据库,但老师课程设计要求数据存储在数据库怎么办???主包看了些网络上的资源,觉得讲得都不是很能快速上手,所以决定自己写一篇博客

SQLiteCpp是一个基于 C++ 封装的 SQLite 操作库,简化原生 C API 使用,可以用面向对象的方式更方便地操作数据库。

准备工作

安装 SQLiteCpp

从GitHub上下载 SQLiteCpp 源码

地址:https://github.com/SRombauts/SQLiteCpp

点击右上角绿色按钮「Code」→ 「Download ZIP」,解压得到一个 SQLiteCpp-master 文件夹 

下载并准备 sqlite3.c/.h

SQLiteCpp 依赖原生 SQLite 的源码,所以我们去官网 https://www.sqlite.org/download.html

下载sqlite3.c(源码),sqlite3.h(头文件)这两个文件,用于编译

点击第二个“sqlite-amalgamation-*.zip”压缩包,解压后就能得到.c和.h文件

往下滑,我的电脑是64位的windows系统,所以还下载了“Precompiled Binaries for Windows”的第二个压缩包sqlite3.dll,用于程序运行时动态链接

第三个压缩包“sqlite-tools-win-x64-3500100.zip”,是带命令行工具的,sqlite3.exe可以在终端里手动打开 .db 文件查看和操作(非常适合调试数据库),推荐下载

把这些文件放入你的C++项目的一个 “sqlite” 文件夹中备用

用 Code::Blocks 创建 SQLiteCpp 静态库项目

后面需要连接SQL静态库,但我想直接连自己的(也可以网上下载别人的先测试,那就自己跳过这一部分)

打开 Code::Blocks → File → New → Project,创建一个Static Library

将 SQLiteCpp 源码添加进来

SQLiteCpp-master/src/ 下的所有 .cpp 文件和SQLiteCpp-master/include/SQLiteCpp/下所有的.h文件都添加进项目

再把 sqlite3.csqlite3.h 和sqlite3ext.h加进来(SQLiteCpp 依赖它)

设置头文件搜索路径 

虽然你添加了文件,但 编译器默认不会自动搜索别的文件夹,你需要手动告诉它在哪里找 

Build options → Search directories → Compiler,添加SQLiteCpp-master/include的文件地址

以及SQLiteCpp\sqlite-amalgamation-3500100的地址(是 sqlite3.h 所在目录)

构建静态库 

编译后,会生成一个 .a 文件(MinGW 下是 libSQLiteCppStatic.a,MSVC 是 .lib

编译成功

.a文件在bin目录的debug文件下

添加 SQLite3 源码文件

创建一个C++项目

在项目中点击右键 → Add files...

添加你下载的 sqlite3.c文件(噢我的文件夹好像有点多,下次注意)

 添加 SQLiteCpp 的头文件路径

主包第一次弄哈,为了安全起见只修改当前项目的编译器配置,而不会影响整个 Code::Blocks 环境。

右键项目 → Build Options...,左边选你的项目名(不是 "Debug"也不是 "Release")这样设置就只对当前项目生效。

点击Search directories → Compiler,点击"Add"

复制你SQLiteCpp-master/include的文件地址和\sqlite-amalgamation-3500100(sqlite3.h 所在目录)的文件地址,添加

添加库文件路径

Search directories → Linker,添加.a的包含文件SQLiteCppStatic\bin\Debug

链接库文件

Linker settings →Link libraries,点击 Add

尝试运行

输入以下代码,如能正常编译并运行 → 就代表 .a 链接库成功了 

#include <SQLiteCpp/SQLiteCpp.h>
#include <iostream>int main() {try {SQLite::Database db("test.db", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE);db.exec("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, name TEXT);");db.exec("INSERT INTO test (name) VALUES ('Alice');");std::cout << "数据库操作成功!" << std::endl;} catch (std::exception& e) {std::cerr << "错误:" << e.what() << std::endl;}return 0;
}

哇哦,主包运行成功了,成功一小步,go on!go on!

接下来可以开始在你的系统中使用 SQLite 数据库来替代 CSV 或手动数据管理了

把原项目代码连接数据库

前面创建的静态库(.a 文件)是你程序的“工具箱”,提供操作数据库的各种 C++ 接口

它只需要被链接进你的课设项目;不需要单独写代码去操作它;编译一次即可,后续只用它就行

手动向 school.db 数据库插入数据

下载 DB Browser for SQLite(图形界面,操作简单,无需写代码)

网址:https://sqlitebrowser.org/dl/

我下载的第三个,我看到下面还有个轻便版(portable)的

生成school.db文件

在你的项目运行如下(类似,根据你的需要)代码

void initDatabase() {// 如果数据库文件已存在,则跳过创建if (std::filesystem::exists("school.db")) return;try {SQLite::Database db("school.db", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE);// 创建 users 表db.exec("CREATE TABLE users (""type TEXT NOT NULL,""id TEXT PRIMARY KEY,""username TEXT,""password TEXT,""phone TEXT,""class TEXT,""major TEXT"");");// 创建 courses 表db.exec("CREATE TABLE courses (""id TEXT PRIMARY KEY,""name TEXT,""time TEXT,""location TEXT,""teacherId TEXT"");");// 创建 student_courses 表db.exec("CREATE TABLE student_courses (""stuId TEXT,""courseId TEXT,""PRIMARY KEY (stuId, courseId)"");");// 创建 student_grades 表db.exec("CREATE TABLE student_grades (""stuId TEXT,""courseId TEXT,""grade INTEGER,""PRIMARY KEY (stuId, courseId)"");");cout << "数据库和表创建成功。" << std::endl;} catch (const std::exception& e) {cerr << "创建数据库或表时出错: " << e.what() << std::endl;}
}

运行后,Code::Blocks 项目所在的目录下就会生成一个 school.db 文件

向表中插入数据

打开DB Browser for SQLite,点击左上角,打开school.db

点击“浏览数据”,可以在“表”处选择要编辑的表格,点击图示“插入”

录入完数据后,点击“写入更改”

这个软件真实太好用了,欢迎大家前去探索实操!!!

补充

嘻嘻,主包已经成了,在现在的AI大环境下其实还是蛮简单的嘛~

再补充几个主包操作过程中学习到的东西,是自己的小总结,可能有些不太准确的,欢迎大家前来探讨.

通过codeblocks程序向数据库载入数据,写入中文时会在数据库中自动以二进制存储,再读取数据时能直接正常显示中文;但如果直接在数据库插入数据时写入中文不能正常显示(数据库的字符编码是utf-8,但codeblocks不是,若自己改动的话输出框会显示乱码,这点codeblocks还是挺不好的‘很多编辑器的字符编码现在都是utf-8了’)

再来分享几个数据库常用简单操作

数据库的打开/创建

SQLite::Database db("school.db", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE);
//SQLite::Database是SQLite C++封装库(数据库文件路径‘一般当前目录下’,读写|打开模式‘不存在则创建’)

创建表 

db.exec("CREATE TABLE users ("        //CREATE TABLE是SQLite建表语句,定义users表结构"type TEXT NOT NULL,"         //TEXT定义文本类型,NOT NULL表示必填"id TEXT PRIMARY KEY,"        //主键(PRIMARY KEY),保证唯一"username TEXT,""password TEXT,""phone TEXT,""class TEXT,""major TEXT"");");

数据库连接与查询

SQLite::Statement query(db, "SELECT type, id, username, password, phone, class, major FROM users");    //创建一个SQLite::Statement对象query,执行SQL查询语句(从users表中选择type,id…这些列的数据)
while (query.executeStep()) {       //执行查询并移动到下一行(只要还有下一行就返回true)string type = query.getColumn(0).getString();  //从查询结果行的第0列获取字符串类型的数据string id = query.getColumn(1).getString();    //第1列
}

清空表数据

db.exec("DELETE FROM users");  //使用exec方法执行SQL语句DELETE FROM,删除users表中的所有记录
SQLite::Statement insert(db, "INSERT INTO users VALUES (?, ?, ?, ?, ?, ?, ?)");   //创建了一个SQLite::Statement对象insert,绑定到db数据库,并准备了一条插入数据的SQL语句,“?”是占位符
insert.bind(1, u->getUserType());  //使用bind方法将数据绑定到第一个占位符
insert.bind(2, u->getId());        //第二个
insert.bind(3, u->getUsername());
insert.exec();                     //执行插入语句
insert.reset();                    //重置insert语句对象,为下一次插入操作做准备

 好了,拜拜,有些事情好像真的还是不要将就的好,努力努力,学习到了东西,这种充实感其实好像也很不错~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86680.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86680.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86680.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS中对输入面图层A的相交问题批量处理的实现方法

一、背景及意义 在各种数据建库中&#xff0c;拓扑错误是必须处理的&#xff0c;其中最常见的是重叠问题&#xff0c;我们常用拓扑工具来检查重叠&#xff0c;但是由于拓扑工具只能作为检查且不能批量修改&#xff0c;此时我们可以使用“相交”工具来检查出重叠部分&#xff0…

【学习笔记】3.3 Decoder-Only PLM

参考资料&#xff1a;https://github.com/datawhalechina/happy-llm Decoder-Only是当前大型语言模型&#xff08;LLM&#xff09;的基础架构&#xff0c;如 GPT 系列。GPT 是 Decoder-Only 架构的代表&#xff0c;而开源 LLM 如 LLaMA 也是在 GPT 架构基础上发展而来的。 3…

主流的Attention Backend介绍

Attention Backend 技术背景 注意力&#xff08;Attention&#xff09;机制在深度学习中扮演着关键角色&#xff0c;它帮助模型在处理序列数据时&#xff0c;有选择地关注输入中的重要信息。然而&#xff0c;传统的注意力计算往往受到内存访问和算力分配的双重制约&#xff0c…

Linux内存取证

我们先把linux取证文件放到kali中&#xff0c;然后这里的Ubuntu18.04-5.4.0-84-generic.zip需要不解压直接放到vol工具中 然后把Ubuntu18.04-5.4.0-84-generic放到vol工具中&#xff0c;然后开始去这个&#xff0c;使用vol工具查看linux的版本信息 这个LinuxUbuntu18_04-5_4_0-…

使用docx4j 实现word转pdf(linux乱码处理)

由于系统之前使用了是itext进行转换的&#xff0c;现在已经不是开源的工具了&#xff0c;需要收费&#xff0c;然后进行改造&#xff0c;具体处理如下。 <dependency><groupId>org.docx4j</groupId><artifactId>docx4j</artifactId><version…

C++ - vector 的相关练习

目录 前言 1、题1 只出现一次的数字 &#xff1a; 解法一&#xff1a;遍历 参考代码&#xff1a; 解法二&#xff1a;按位异或 参考代码&#xff1a; 解法三&#xff1a;哈希表 参考代码&#xff1a; 2、题2 杨辉三角&#xff1a; 参考代码&#xff1a; 总结 前言 …

JDK 1.8 Stream API:集合流处理深度解析

JDK 1.8 Stream API&#xff1a;集合流处理深度解析 摘要&#xff1a;Stream API 是 JDK 1.8 的革命性特性&#xff0c;它将集合操作从传统迭代升级为声明式函数式处理。Stream API三个阶段&#xff08;创建→中间操作→终端操作&#xff09;详解流处理机制&#xff0c;辅以代…

2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷(二)

2025学年湖北省职业院校技能大赛 “信息安全管理与评估”赛项 样题卷&#xff08;二&#xff09; 第一部分&#xff1a;第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&#xff1a;应急响应&#xff08;可以培训有答案&#xff09;任务 2&…

AiPy实战(5):效率革命!5分钟构建行业分析报告

在当今数字化时代&#xff0c;数据呈指数级增长&#xff0c;行业分析报告对于企业的决策制定愈发关键。传统上&#xff0c;撰写一份行业分析报告&#xff0c;需要分析师耗费大量时间从各类数据库、新闻资讯平台、行业报告中手动收集数据&#xff0c;再进行整理、分析和撰写&…

docker小白自存-windows系统通过docker安装n8n-nodes-puppeteer

n8n上直接在社区下载puppeteer节点&#xff0c;使用时会报错说没有chromium依赖。 找到了n8n-nodes-puppeteer的github试图解决 根据他的docker安装指南执行&#xff0c;运行容器时会报exec /docker-custom-entrypoint.sh: no such file or directory &#xff08;明明文件都有…

脚本shebang的作用与使用方法

#!&#xff08;称为 shebang 或 hashbang&#xff09;是脚本文件开头的前两个字符&#xff0c;用于告诉操作系统应该使用哪个解释器来执行该脚本。 核心作用&#xff1a; 指定解释器&#xff1a; 明确告诉系统运行这个脚本时应该调用哪个程序&#xff08;解释器&#xff09;来…

【大模型学习 | BERT 量化学习 (1)】

BERT 情感分析 一、 数据集加载与模型训练 from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments from datasets import load_dataset import torch import numpy as np from sklearn.metrics import accuracy_score mode_na…

用低通滤波优化串口或485 通信指示灯电路

常见的通信指示灯电路就是简单的把LED 连到TXD 和RXD 上&#xff0c;一有动静就闪一下。问题是&#xff0c;如果波特率很高&#xff0c;一次通信时间很短&#xff0c;相当于占空比很低&#xff0c;LED 闪烁的亮度就很弱&#xff0c;不容易观察。比如MODBUS 通信&#xff0c;波特…

【纯干货】调整word目录中的行距以及右对齐页码

1.问题展现 目录生成会遇到一些奇葩现象 所以到了展现技术力的时候了【doge】 2.解决word目录中的行距问题 选中目录中的文字-》段落 此时你可能勾选了图片中的一个以上&#xff0c;把他们都取消了&#xff0c; 由于一个目录的标题对应一个样式&#xff0c;第一个也可以取消 …

pandas 优雅处理值类型为list的列的csv读写问题

文章目录 直接存储join list 变成字符串存储json.dumps序列化存储以及json.loads反序列化读取总结 之所以分析这个问题,是因为读者在跟第三方数据供应商对接数据的时候,老是会遇到数据加载都会出错的问题,其中一个原因就是list类型数据没有正确储存,于是笔者在这篇文章里面详细…

一种解决 OpenWrt 安装 docker 之后局域网的设备之间无法互相访问通信的方法

文章目录 一、问题背景二、解决方案&#xff08;方法一&#xff09;修改全局设置的 转发&#xff08; forward&#xff09; 为 接受&#xff08;ACCEPT&#xff09;&#xff08;方法二&#xff09;设置 net.bridge.bridge-nf-call-iptables0 并将 docker 的容器网络设置为host …

Leetcode百题斩-贪心

贪心也是一个很有意思的专题&#xff0c;能遇到很多神奇的思路。 但这个专题&#xff0c;leetcode也没放Hard&#xff0c;果然是怕这种玄学专题上点难度大家罩不住。那就很快了&#xff0c;直接过 763. Partition Labels[Medium] 思路&#xff1a;将字母串分组&#xff0c;相…

基于多径信道的分集接收技术性能优化与仿真分析

基于多径信道的分集接收技术性能优化与仿真分析 一、多径信道建模与仿真 1. 多径信道建模(MATLAB实现) classdef MultipathChannel < handlepropertiesSampleRate = 1e6; % 采样率 (Hz)MaxDoppler = 100; % 最大多普勒频移 (Hz)DelayVector = [0

LeetCode 713.乘积小于K的子数组

给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目。 示例 1&#xff1a; 输入&#xff1a;nums [10,5,2,6], k 100 输出&#xff1a;8 解释&#xff1a;8 个乘积小于 100 的子数组分别为&#xff1a;[10]、[5…

打破网络安全孤岛:实现防御数据协作

作者&#xff1a;来自 Elastic Crossley McEwen, Oksana Abramovych 现代网络战场不再受组织边界的限制。在各类防御网络中&#xff0c;关键的结构化、非结构化和半结构化数据分布在不同的专业环境中&#xff0c;形成孤岛 —— 从机密情报系统到作战指挥平台&#xff0c;再到战…