SQLite数据库

接触到很多的sqlite数据库的内容,主要记录一下:

一些学习链接:

https://zhuanlan.zhihu.com/p/604609409?utm_id=0
https://blog.csdn.net/QtCompany/article/details/129671584

SQLite Expert的官方下载链接:
https://www.sqliteexpert.com/download.html
下载比较慢的我下面上传了安装包。

封装了一个库:

#ifndef XSQL_H
#define XSQL_H/******************************************** 1、打开数据库* 2、关闭数据库********************************************* 3、创建表格*       列表格式(表名,{表头[X] 类型},{表头[X] 类型}……)*       "KEY"默认为创建自增主键,表头id* 4、重命名表格* 5、删除表格* 6、表格添加新列*       QString new_column 为{表头[X] 类型}********************************************* 7、插入新行*       列表格式(表名,{表头[X],数值},{表头[X],数值}……)* 8、更新某行*       列表格式(表名,{表头[X],数值},{表头[X],数值}……,{表头[Y],数值})* 9、删除某行*       列表格式(表名,ID表头,ID)********************************************* 10、重命名ID*       列表格式(表名,ID表头,旧ID,新ID)* 11、获取某一行*       列表格式(表名,{表头[X],表头[X],表头[X]……},{ID表头,ID[Y]})*       返回X和Y对应的值* 12、获取最大ID* 13、获取最小ID* 14、获取所有表*******************************************/#include <QObject>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlDriver>
#include <QDateTime>class XSQL : public QObject
{Q_OBJECT
public:explicit XSQL(QObject *parent = nullptr);public://数据库开关bool open(QSqlDatabase &data, QString path, QString connect);bool close(QSqlDatabase &data);//表格操作bool create_table(QSqlDatabase &data, QList<QString> list);bool rename_table(QSqlDatabase &data, QString old_name, QString new_name);bool delete_table(QSqlDatabase &data, QString name);//列操作bool add_column(QSqlDatabase &data, QString table_name, QString new_column);//行操作bool insert_row(QSqlDatabase &data, QList<QVariant> list);bool update_row(QSqlDatabase &data, QList<QVariant> list);bool delete_row(QSqlDatabase &data, QList<QVariant> list);//行列操作bool rename_id(QSqlDatabase &data, QList<QVariant> list);//获取数据std::vector<QVariant> get_row(QSqlDatabase &data, QList<QVariant> list);//其他int get_max_id(QSqlDatabase &data, QString table_name);int get_min_id(QSqlDatabase &data, QString table_name);bool table_name(QSqlDatabase &data,QStringList &tablenames);bool table_exists(QSqlQuery &query, QString table_name);};#endif // XSQL_H
#include "xsql.h"
#include "qdebug.h"#pragma execution_character_set("utf-8")XSQL::XSQL(QObject *parent): QObject{parent}
{}//打开数据库
bool XSQL::open(QSqlDatabase &data, QString path, QString connect)
{if(close(data))qDebug() << "去除旧连接"<< connect;data = QSqlDatabase::addDatabase("QSQLITE", connect);data.setDatabaseName(path);if (!data.open()){qDebug() << "连接" << connect << "数据库失败" << data.lastError();return false;}else{qDebug() << "成功连接" << connect << "数据库" ;return true;}
}//关闭数据库
bool XSQL::close(QSqlDatabase &data)
{if(data.isOpen()){QString connection_name = data.connectionName();data.close();data = QSqlDatabase();data.removeDatabase(connection_name);return true;}else return false;
}//创建表
//列表格式(表名,{表头[X] 类型},{表头[X] 类型}……)
//"KEY"默认为创建自增主键,表头id
bool XSQL::create_table(QSqlDatabase &data, QList<QString> list)
{QSqlQuery query(data);if(table_exists(query, list[0])){qDebug() << "创建表" + list[0] + "失败,已经存在这个表";return false;}if(list.count()<2){qDebug() << "创建表" + list[0] + "失败,请至少包含主键列";return false;}QString content;for(int i=0; i<list.count(); i++){if(i==0)content = content.append("CREATE TABLE " + list[i] + "(");else if(list[i] == "KEY")content = content.append("id INTEGER PRIMARY KEY AUTOINCREMENT, ");else if(i>0 && i<list.count()-1 && list[i] != "KEY")content = content.append(list[i] + ", ");else if(i == list.count()-1 && list[i] != "KEY")content = content.append(list[i] + ")");elseqDebug() << "数组遍历错误,请检查拼写";}if(!query.exec(content)){qDebug() << "创建表" + list[0] + "失败,请检查列和类型是否拼写错误"<< query.lastError();return false;}else{qDebug() << "创建表" + list[0] + "成功";return true;}
}//重命名表
bool XSQL::rename_table(QSqlDatabase &data, QString old_name, QString new_name)
{QSqlQuery query(data);if(!table_exists(query, old_name)){qDebug() << "重命名表" + old_name + "失败,请检查是否存在这个表";return false;}if(table_exists(query, new_name)){qDebug() << "重命名表" + old_name + "失败,新表名已被占用";return false;}if(!query.exec("ALTER TABLE " + old_name + " RENAME TO " + new_name)){qDebug() << "重命名表" + old_name + "失败"<< query.lastError();return false;}else{qDebug() << "重命名表" + old_name + "成功, 新表名:" + new_name;return true;}
}//删除表
bool XSQL::delete_table(QSqlDatabase &data, QString table_name)
{QSqlQuery query(data);if(!table_exists(query, table_name)){qDebug() << "删除表" + table_name + "失败,请检查是否存在这个表";return false;}if(!query.exec("DROP TABLE IF EXISTS " + table_name)){qDebug() << "删除表" + table_name + "失败"<< query.lastError();return false;}else{qDebug() << "删除表" + table_name + "成功";return true;}
}//添加新列
bool XSQL::add_column(QSqlDatabase &data, QString table_name, QString new_column)
{QSqlQuery query(data);if(!table_exists(query, table_name)){qDebug() << "表" + table_name + "中添加新列失败,请检查是否存在这个表";return false;}if(!query.exec("ALTER TABLE " + table_name + " ADD COLUMN " + new_column)){qDebug() << "表" + table_name + "中添加新列" + new_column + "失败"<< query.lastError();return false;}else{qDebug() << "表" + table_name + "中添加新列" + new_column + "成功";return true;}
}//插入行
//列表格式(表名,{表头[X],数值},{表头[X],数值}……)
bool XSQL::insert_row(QSqlDatabase &data, QList<QVariant> list)
{QSqlQuery query(data);if(!table_exists(query, list[0].toString())){qDebug() << "表" + list[0].toString() + "中插入行失败,请检查是否存在这个表";return false;}if(list.count()<3){qDebug() << "表" + list[0].toString() + "中插入行失败,请至少包含(表名,{表头[X],数值})三组数值";return false;}QString content, columns, values;for(int i=1; i<list.count(); i++){if(i%2!=0){if(i==list.count()-2){columns.append(list[i].toString());values.append(":" + list[i].toString());}else{columns.append(list[i].toString() + ", ");values.append(":" + list[i].toString() + ", ");}}}content = "INSERT INTO " + list[0].toString() + " (" + columns + ") VALUES (" + values + ")";query.prepare(content);
//    qDebug() << content;for(int i=1; i<list.count(); i++)if(i%2==0){query.bindValue(":"+list[i-1].toString(), list[i]);}if(!query.exec()){qDebug() << "表" + list[0].toString() + "中插入行失败" << query.lastError();return false;}else{qDebug() << "表" + list[0].toString() + "中插入行成功";return true;}}//更新行
//列表格式(表名,{表头[X],数值},{表头[X],数值}……,{表头[Y],数值})
bool XSQL::update_row(QSqlDatabase &data, QList<QVariant> list)
{QSqlQuery query(data);if(!table_exists(query, list[0].toString())){qDebug() << "表" + list[0].toString() + "中更新行失败,请检查是否存在这个表";return false;}if(list.count()<5){qDebug() << "表" + list[0].toString() + "中更新行失败,请至少包含(表名,{表头[X],数值},{表头[Y],数值})五组数值";return false;}QString content, condition, values;for(int i=1; i<list.count(); i++){if(i%2!=0){if(i==list.count()-4)values.append(list[i].toString() + " = :" + list[i].toString());else if(i==list.count()-2)condition.append(list[i].toString() + " = :" + list[i].toString());elsevalues.append(list[i].toString() + " = :" + list[i].toString() + ", ");}}content = "UPDATE " + list[0].toString() + " SET " + values + " WHERE " + condition;
//    qDebug() << content;query.prepare(content);for(int i=1; i<list.count(); i++){if(i%2==0){query.bindValue(":"+list[i-1].toString(), list[i]);}}if(!query.exec()){qDebug() << "表" + list[0].toString() + "中更新行失败" << query.lastError();return false;}else{qDebug() << "表" + list[0].toString() + "中更新行成功";return true;}
}//删除行
//列表格式(表名,ID表头,ID)
bool XSQL::delete_row(QSqlDatabase &data, QList<QVariant> list)
{QString table_name = list[0].toString();QSqlQuery query(data);if(!table_exists(query, table_name)){qDebug() << "表" + table_name + "中删除行失败,请检查是否存在这个表";return false;}QString id_column = list[1].toString();int id = list[2].toInt();QString id_str = QString::number(id);if(!query.exec("DELETE FROM " +table_name + " WHERE "+ id_column +" = " + id_str)){qDebug()<< "删除行失败" << query.lastError();return false;}else{qDebug()<<"已经删除ID为" << id_str << "的行";return true;}
}//重命名ID
//列表格式(表名,ID表头,旧ID,新ID)
bool XSQL::rename_id(QSqlDatabase &data,  QList<QVariant> list)
{QString table_name = list[0].toString();QString id_column = list[1].toString();int old_id = list[2].toInt();int new_id = list[3].toInt();QSqlQuery query(data);if(!table_exists(query, table_name)){qDebug() << "表" + table_name + "中删除行失败,请检查是否存在这个表";return false;}QString old_id_str = QString::number(old_id);QString new_id_str = QString::number(new_id);if(!query.exec("UPDATE " + table_name + " SET "+ id_column +" = " + new_id_str + " WHERE "+ id_column +" = " + old_id_str)){qDebug()<< "重命名ID失败" << query.lastError();return false;}else{qDebug()<<"重命名ID成功,ID从" + old_id_str + "变更为" + new_id_str;return true;}
}//获取行
//列表格式(表名,{表头[X],表头[X],表头[X]……},{ID表头,ID[Y]})
//返回X和Y对应的值
std::vector<QVariant> XSQL::get_row(QSqlDatabase &data, QList<QVariant> list)
{QSqlQuery query(data);if(!table_exists(query, list[0].toString())){qDebug() << "表" + list[0].toString() + "中行获取数据失败,请检查是否存在这个表";}if(list.count()<4){qDebug() << "表" + list[0].toString() + "中行获取数据失败,请至少包含(表名,{表头[X]}, {ID表头,ID[Y]})四组数值";}QString column;std::vector<QVariant> list_return;QString id_column = list[list.count()-2].toString();QString id;QVariant id_var = list[list.count()-1];if(id_var.type() == QVariant::Int)id = QString::number(list[list.count()-1].toInt());elseid = " '"+list[list.count()-1].toString()+"' ";for(int i=1; i<list.count()-2; i++){if(i==list.count()-3)column.append(list[i].toString());elsecolumn.append(list[i].toString() + ", ");}QString content;content = "SELECT " + column + " FROM " + list[0].toString() + " WHERE "+ id_column +" = " + id;
//    qDebug() << content;if(!query.exec(content)){qDebug() << "获取指定获取行失败" << query.lastError();}else{while(query.next()){for(int i=0; i<list.count()-3; i++)list_return.push_back(query.value(i));}qDebug() << "获取指定获取行成功";}return list_return;
}//获取最大ID
int XSQL::get_max_id(QSqlDatabase &data, QString table_name)
{QSqlQuery query(data);if(!table_exists(query, table_name)){qDebug() << "表" + table_name + "中获取最大ID失败,请检查是否存在这个表";}int max_id = 0;query.prepare("SELECT max(id) FROM " + table_name);if (!query.exec()){qDebug() << "获取最大id失败" << query.lastError();}else{while (query.next()){max_id = query.value(0).toInt();}qDebug() << "获取最大id成功 " << max_id;}return max_id;
}//获取最小ID
int XSQL::get_min_id(QSqlDatabase &data, QString table_name)
{QSqlQuery query(data);if(!table_exists(query, table_name)){qDebug() << "表" + table_name + "中获取最小ID失败,请检查是否存在这个表";}int min_id = 0;query.prepare("SELECT min(id) FROM " + table_name);if (!query.exec()){qDebug() << "获取最小id失败" << query.lastError();}else{while (query.next()){min_id = query.value(0).toInt();}qDebug() << "获取最小id成功 " << min_id;}return min_id;
}bool XSQL::table_exists(QSqlQuery &query, QString table_name)
{query.exec("SELECT name FROM sqlite_master WHERE type='table' AND name='"+table_name+"'");if(query.next()){return true;}else{return false;}
}bool XSQL::table_name(QSqlDatabase &data,QStringList &tablenames)
{QSqlQuery query(data);QString content;content = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name";if(!query.exec(content)){qDebug() << "获取所有表失败" << query.lastError();return false;}else{tablenames.clear();while(query.next()){tablenames.push_back(query.value(0).toString());}qDebug() << "获取所有表成功";}return true;
}

一些发现

1、表的标题栏不能含有中文,表名和表内容可以有中文

2、打开数据库

bool XSQL::open(QSqlDatabase &data, QString path, QString connect)

主要是传入数据库所在文件地址以及连接名,返回是否打开成功。

//初始化数据库QSqlDatabase  sqldata;XSQL *batchsql = new XSQL(this);QString sqlpath = QApplication::applicationDirPath()+ "/batch.data";if(!batchsql->open(sqldata, sqlpath, "batch")){LogInfo("初始化数据库失败");return false;}

3、获取所有表名,也可以使用上面的那种

 	batchsql->open(sqldata, sqlpath, "batch");QStringList BatchNametables = sqldata.tables();BatchNametables.removeOne("sqlite_sequence");

QStringList tables(QSql::TableType type = QSql::Tables),返回由参数类型指定的数据库表、系统表和视图的列表。

enum QSql::TableType:此枚举类型描述 SQL 表的类型。

  • QSql::Tables:用户可见的所有表。
  • QSql::SystemTables:数据库使用的内部表。
  • QSql::Views:用户可见的所有视图。
  • QSql::AllTables:以上所有。

实例:

包含SQLite Expert安装包,封装的库和使用例程:

https://download.csdn.net/download/cao_jie_xin/88583753

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

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

相关文章

RabbitMQ的Web管理页面

访问页面 http://IP:15672/账号密码默认都是&#xff1a;guest 主页概览 Overview 显示当前RabbitMQ Broker的运行信息、连接信息、集群信息以及配置信息等。 连接 Connections 无论生产者还是消费者&#xff0c;都需要与RabbitMQ建立连接后才可以完成消息的生产和消费&#…

QT(18):QString

目录 QStringQTypedArrayDataQTypedArrayDataQLatin1StringQStringLiteral乱码 QStringRef QString QString 存储16位QChar的字符串&#xff0c;其中每个QChar对应一个 UTF-16代码单元。QString 使用&#xff08;写入时复制copy-on-write&#xff09;来减少内存使用并避免不必…

CSS的filter属性详解

目录 前言 函数 blur()函数 brightness()函数 contrast()函数 drop-shadow()函数 grayscale()函数 hue-rotate() (en-US)函数 invert() (en-US)函数 opacity()函数 saturate() (en-US)函数 sepia() (en-US)函数 组合函数 前言 CSS的filter 属性将模糊或颜色偏移等…

【正点原子STM32连载】 第六十一章 USB读卡器(Slave)实验摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子APM32F407最小系统板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html## 第六十…

Electronica慕尼黑电子展 Samtec团队与21ic分享虎家产品与方案

【摘要/前言】 “希望但凡是能够使用到连接器的场合都有Samtec的身影” 在慕尼黑上海电子展现场&#xff0c;Samtec华东区销售经理章桢彦先生在与21ic副主编刘岩轩老师的采访中&#xff0c;如是说道。这是一种愿景&#xff0c;更是Samtec的努力方向。短短一句话&#xff0c;…

视频播放标签,设置自动播放 暂停键 播放键 js方法

1 创建video 标签&#xff0c;标签设置属性 autoplay 自动播放&#xff0c;宽高100 全屏。 <video class"video" id"shipin" controls"controls" autoplay poster"" style"width:100%;height:100%;position:fixed;">&…

notepad++ 插件JSONView安装

1&#xff0c;前提 开发过程中经常需要处理json格式语句&#xff0c;需要对json数据格式化处理&#xff0c;因为使用的是虚拟机内开发&#xff0c;所以没法连接外网&#xff0c;只能在本地电脑下载插件后&#xff0c;然后上传到虚拟机中&#xff0c;进行安装使用。 2&#xf…

1+x中级网络运维实验题

任务 1&#xff1a; 设备命名 为了方便后期维护和故障定位及网络的规范性&#xff0c;需要对网络设备进行规范化命名。请根据 Figure 3-1 实验考试拓扑对设备进行命名。命名规则为&#xff1a;城市-设备的设置地点-设备的功能属性和序号-设备型号。例如&#xff1a;处于杭州校…

@Autowired注解获取对象为null

问题再现 兄弟们&#xff0c;看见了吗&#xff1f;这里我Autowired进来的forkliftService 居然为null 且我SysForkliftServiceImpl上面是加了Service注解的 分析原因 主要原因就是因为该类继承了一个第三方框架SimpleChannelInboundHandler&#xff0c;在执行的过程中&#…

[Java 源码] 美团一面~ArrayList 的底层实现

文章目录 1. ArrayList 与 数组的区别2 ArrayList 的初始化容量3. ArrayList 的扩容具体指什么4. ArrayList是如何实现扩容的&#xff1f;5. ArrayList有缩容吗&#xff1f; 1. ArrayList 与 数组的区别 ArrayList 的底层是数组队列&#xff0c;相当于动态数组。与 Java 中的数…

2023年【P气瓶充装】找解析及P气瓶充装复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 P气瓶充装找解析参考答案及P气瓶充装考试试题解析是安全生产模拟考试一点通题库老师及P气瓶充装操作证已考过的学员汇总&#xff0c;相对有效帮助P气瓶充装复审模拟考试学员顺利通过考试。 1、【多选题】CNG双燃料汽车…

Dockerfile 与 Docker Compose区别

目录 Dockerfile Docker Compose 综合比较 Dockerfile 用途&#xff1a; Dockerfile 用于定义单个容器的构建过程。它包含了一系列指令&#xff0c;每个指令都代表容器构建过程中的一个步骤。这些步骤包括从基础镜像中构建、安装依赖、拷贝文件、设置环境变量等操作。 语法…

【IEEE独立出版】2024第四届神经网络、信息与通信工程国际学术会议(NNICE 2024)

2024第四届神经网络、信息与通信工程国际学术会议&#xff08;NNICE 2024&#xff09; 2024 4th International Conference on Neural Networks, Information and Communication Engineering 2024第四神经网络、信息与通信工程国际学术会议&#xff08;NNICE 2024&#xff0…

电商API接口对于实现电商系统平台的搭建有哪些作用?

电商API接口用于实现电商平台的数据交互和功能调用。具体来说&#xff0c;电商API接口可以用于以下几个方面&#xff1a; 1. 商品管理&#xff1a;通过API接口&#xff0c;可以实现商品的添加、修改、删除、查询等操作。商家可以通过API接口将自己的商品信息上传到电商平台&…

三、Linux高级命令

目录 1、重定向命令 1.1 重定向 > 1.2 重定向 >> 该章节的所有操作都在/export/data/shell目录进行&#xff0c;请提前创建该目录。 mkdir -p /export/data/ 1、重定向命令 1.1 重定向 > Linux 允许将命令执行结果重定向到一个文件&#xff0c;本应显示在…

群晖NAS:docker(Container Manager)、npm安装Verdaccio并常见命令集合

群晖NAS&#xff1a;docker&#xff08;Container Manager&#xff09;、npm安装Verdaccio并常见命令集合 自建 npm 资源库&#xff0c;使用Verdaccio。如果觉得麻烦&#xff0c;直接可以在外网注册 https://www.npmjs.com/ 网站。大同小异&#xff0c;自己搭建搭建方便局域网…

虾皮、Lazada稳定的测评系统需要哪些技术要求

测评作为一项高效运营手段&#xff0c;具有显著的重要性。然而&#xff0c;对于卖家而言&#xff0c;自行建立一套测评系统所需的技术条件并非易事。 在构建系统之前&#xff0c;必须深入理解每个平台的控制风险机制&#xff0c;而后才能开展下一步的建设工作。 1.首先&#…

代币化:2024年的金融浪潮预示着什么?

自“TradFi”领袖到加密专家&#xff0c;各方预测代币化机会高达数十万亿。虽然已有引人注目的用例&#xff0c;但与未来几年可能在链上转移的大量数字化资产相比&#xff0c;这些仅是冰山一角。 代币化何时会变为洪流&#xff1f;什么阻碍了其发展&#xff1f; 今年10月&…

SpringBoot下使用Quartz设置定时任务

SpringBoot下使用Quartz设置定时任务 基础使用添加依赖demo 基础使用 Quartz 的核心类有以下三部分&#xff1a; 任务 Job &#xff1a; 需要实现的任务类&#xff0c;实现 execute() 方法&#xff0c;执行后完成任务。触发器 Trigger &#xff1a; 包括 SimpleTrigger 和 Cr…

VGN S99快捷键,说明书

VGN S99快捷键-说明书 按键说明灯光效果常见疑难 按键说明 切换关闭电量指示灯&#xff1a;Fn home 灯光效果 常见疑难