QT之SQLITE3数据库
目录
一、数据库简介
二、Linux下使用sqlite3
三、SQL语句
1.Create Table
2.Drop Table
3.Truncate Table
4.Insert Into
5.Select
6.Delete
7.Update
8.Alter Table
9.约束
四、Sqlite3类
1.QSqlDatabase
2.QSqlQuery
3.QStandardItemMode
4.QSqlTableModel
5.QSqlQueryModel
五、数据库简单加密
一、数据库简介
数据库是用来存储和管理数据的专用软件,使得管理数据更加安全,方便和高效。数据库对数据的管理的基本单位是表(table)。
常见的数据库:
大型数据库(大型机) ----------- Oracle(亿级)
中型数据库(分布式超大型) -------- mysql(百万级)
轻型数据库(嵌入式设备) -------- sqlite(万级)
访问数据库使用SQL语句,适用于所有的数据库。
二、Linux下使用sqlite3
sudo apt-get update
sudo apt-get install sqlite3
sqlite3使用指令
sqlite3 数据库文件的路径 //打开、创建数据库
sqlite3 first.db //打开数据库成功后会进入命令行
基本操作命令:
.exit/.quit -------- 退出数据库命令行
.help -------------- 帮助说明信息
.tables ------------ 查看当前数据库中所有的表
三、SQL语句
基本语法: 所有的SQL语句都以分号(;)结束并且不区分大小写。
1.Create Table
create table 表名(字段名1 字段类型1,字段名2 字段类型2,字段名3 字段类型3,...);
表格是数据库中储存资料的基本架构。在绝大部份的情况下,数据库厂商不可能知道您需要如何储存您的资料,所以通常您会需要自己在数据库中建立表格。
//创建一个stutbl的表,表中有3个字段
//分别是整数类型的学号id,字符串类型的name和整数类型的age
create table stutbl(id int,name char[20],age int);//不存在则创建
create table if not exists stutbl(id int,name char[20],age int);//如果希望表中某个字段的内容不重复,可以用unique修饰该字段
create table if not exists stutbl(id int unique,name char[20],age int);
字段数据类型:
类型 | 范围 | 说明 |
int/integer | -2^32---2^32-1 | 整型 |
float | -1.79E+308至1.79E+308 | 浮点型 |
real | -3.04E+38至3.04E+38 | 浮点型 |
char | 8000 | 定长的unicode字符类型 |
varchar | 8000 | 变长的unicode字符类型(根据使用长度自动分配) |
text | 2G | 变长的unicode字符类型,文本类型 |
2.Drop Table
从数据库中清除一个表格
drop table 表名;
3.Truncate Table
清除一个表格中的所有数据
truncate table 表名
4.Insert Into
insert into 表名 values(字段值1,字段值2,字段值3,....);
//字段值如果是字符串,必须用''(单引号)括起来
示例:
insert into stutbl values(1001,'张飞',23);
insert into stutbl values(1002,'赵云',19);
insert into stutbl values(1003,'刘备',31);
stutbl表格内容如下:
5.Select
select * from 表名; //查询表中的所有数据
select 字段名, 字段名 form 表格名; //查询结果显示两个字段对应的数据
条件查询(where)
select * form 表格名 where 条件; //查询满足条件的数据
示例:
create table if not exists testtbl(id int unique,name char[20],class int,grade int,age int,score float);INSERT INTO TESTTBL VALUES(1001,'lily',4,3,9,78.5);
INSERT INTO TESTTBL VALUES(1002,'黄国桐',6,7,12,88.5);
INSERT INTO TESTTBL VALUES(1003,'秦逍',3,5,23,91.0);
INSERT INTO TESTTBL VALUES(1004,'韦申姿',9,2,16,81.5);//查找:1.使用where指定查询条件select * from testtbl where class=6;//查询class值为6的条目select * from testtbl where score>=90 or score<80;2.指定查询的字段select id,name,score from testtbl;//只查询id,name,score的字段 3.使用where+like实现模糊查询select * from testtbl where name like '黄%';//查找名字以黄开头的条目4.使用order by实现查询结果按某个字段的值升序/降序输出select * from testtbl order by score desc;//按分数降序排序 select * from testtbl order by grade asc;//按年级升序排序
6.Delete
删除表中的条目
delete from 表名 where 条件;//删除所有符合条件的条目
7.Update
更新(修改)表中的条目
update 表名 set 字段名1=字段值1,字段名2=字段值2... where 条件;//修改符合条件的条目
示例:修改id为1002的年龄为17,分数为95.5
update testtbl set age=17,score=95.5 where id=1002;
8.Alter Table
修改表格,添加某一个字段
alter table 表名 add column 字段名称 字段类型;
9.约束
主键(primary key): 在表格中是唯一的,一个表格中只允许存在一个主键
integer类的主键,可以设置为autoincrement:自增长
NOT NULL值不能为NULL
unique 值唯一
default 设置字段默认值
create table student(id integer priary key autoincrement,#主键,自动增长name varchar(32) NOT NULL,#设置名字不能为空sex varchar(8),phone text UNIQUE,#设置值唯一regtime TimeStamp NOT NULL default (datetime('now','localtime')));
四、Sqlite3类
1.QSqlDatabase
QSqlDatabase提供了一系列的接口用于访问操作数据库,包括连接数据库,输入sql语句。QSqlDatabase的实例表示着一个对数据库的连接。该连接通过一个受支持的数据库驱动程序(从QSqlDriver派生)提供对数据库的访问。
数据库驱动类 ----------- QSqlDatabase
1.添加数据库驱动
[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String(defaultConnection));
//第一个参数需要传入添加的数据库类型,比如使用sqlite就穿"QSQLITE"
//第二个参数选择默认连接方式即可
2.设置数据库文件路径: 传入数据库文件的路径,添加数据库驱动成功后才能调用该函数
void QSqlDatabase::setDatabaseName(const QString &name);
3.打开数据库
bool QSqlDatabase::open();
//添加数据库驱动db = QSqlDatabase::addDatabase("QSQLITE");//指定数据库文件路径db.setDatabaseName("stu.db");//打开数据库if(!db.open())
{QMessageBox::warning(this,"提示","打开数据库失败");
}
2.QSqlQuery
Qt中对数据库的操作主要通过QSqlQuery实现,QSqlQuery提供了执行数据库语句的方法,在Qt中利用QSqlQuery类实现了执行SQL语句。
执行SQL语句的类 -------- QSqlQuery 在执行时才创建该对象
1.执行sql语句
传入要执行的sql语句(不需要加分号),不传参数就执行构造时的sql语句
/返回执行成功/失败
bool QSqlQuery::exec(const QString &query);
2.获取错误原因
QSqlError QSqlQuery::lastError() const; //需要添加 <QSqlError>头文件
3.获取sql语句执行的结果(查询)
每调用一次取出一条结果,返回的结果是在对象中,通过value成员函数获取
bool QSqlQuery::next();
4.获取字段值
QVariant QSqlQuery::value(int index) const;//通过编号获取字段值 QVariant QSqlQuery::value(const QString &name) const;//通过字段名获取字段值
QSqlQuery query;
QString sql;
sql = QString("insert into user_table('编号','姓名','性别','身份') values('%5','%6','%7','%8')")\.arg(value1).arg(value2).arg(value3).arg(value4);
query.exec(sql);
3.QStandardItemMode
QStandardItemModel 是标准的以项数据(item data)为基础的标准数据模型类,通常与QTableView 组合成 Model/View 结构,实现通用的二维数据的管理功能。QStandardItemModel:基于项数据的标准数据模型,可以处理二维数据。维护一个二维的项数据数组,每个项是一个 QStandardltem 类的变量,用于存储项的数据、字体格式、对齐方式。
//构造函数
QStandardItemModel::QStandardItemModel(int rows, int columns, QObject *parent = nullptr)
//设置列头部标题: 传入的是QStandardItem 类型
setHorizontalHeaderItem(列,QStandardItem *item);
//设置单元格内容:
setItem(行,列,QStandardItem *item);
//删除指定的行:
removeRows(起始行号,行数);
//获取行数:rowCount();
//清空:clear();
要把QStandardItemMode模型对象中的内容显示出来,需要将模型对象和表格对象(tableview)绑定,绑定后模型的内容就会同步显示到表格中。
QTableView的成员函数: setModel(模型对象); //为表格绑定模式对象
QStandardItemModel *model; //一般写到类的私有成员中
//初始化模型
model = new QStandardItemModel(this);model->setHorizontalHeaderItem(0,new QStandardItem("id"));
model->setHorizontalHeaderItem(1,new QStandardItem("name"));
model->setHorizontalHeaderItem(2,new QStandardItem("age"));
//绑定模型和表格
ui->tableView->setModel(model);
效果如下:
总之,QTableView是表示图控件、QStandardItemModel是标准数据模型、QItemSelectionModel用来响应消息和出发信号和事件,QStandardItem是QStandardItemModel 的数据管理的基本单元。
4.QSqlTableModel
QSqlTableModel用来显示数据库中数据表的数据,实现对数据的编辑、插入、删除等操作。实现数据的排序和过滤。
QSqlTableModel将SQL语句对数据库的访问完全对象化,将SQL语句的执行封装成对象及其成员函数的实现,同时也对象化了Qt的表格界面,实现了数据库访问的高耦合性,屏蔽了数据库访问的内部细节,将数据库的访问简化成调用对象的接口(成员函数)。
1.绑定表(数据库的表) --------- setTable
[virtual] void QSqlTableModel::setTable(const QString &tableName); //传入数据库表格名
2.插入数据
//插入一条记录: 先构建一条QSqlRecord,在插入
bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record);
//插入一行
bool QAbstractItemModel::insertRow(int row, const QModelIndex &parent = QModelIndex());
3.提交模型到数据库 --------- submit/submitAll
[override virtual slot] bool QSqlTableModel::submit(); [slot] bool QSqlTableModel::submitAll();
4.查询 ---------- select()
[virtual slot] bool QSqlTableModel::select();
注:每次查询后应该重新绑定表格,如果要显示要绑定模型和表格界面。
查找并设置过滤器
[virtual] void QSqlTableModel::setFilter(const QString &filter);//传入的字符串格式"字段名=字段值"
查找并排序
[virtual] void QSqlTableModel::setSort(int column, Qt::SortOrder order);
Qt::AscendingOrder --- 升序 Qt::DescendingOrder --- 降序
5.从模型删除行 -------- removeRow/removeRows
[override virtual] bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); //传入从哪一行开始删除多少行
//返回当前模型的行数
[override virtual] int QSqlTableModel::rowCount(const QModelIndex &parent = QModelIndex()) const;
//删除指定行
bool QAbstractItemModel::removeRow(int row, const QModelIndex &parent = QModelIndex());
6.修改 --------- (查询+插入)
①.//获取QSqlRecord
QSqlRecord QSqlTableModel::record() const;//获取一条空记录 QSqlRecord QSqlTableModel::record(int row) const ; //获取指定行的记录
②.//QSqlRecord的修改字段值的函数
void QSqlRecord::setValue(int index, const QVariant &val); void QSqlRecord::setValue(const QString &name, const QVariant &val);
③.//将修改好的记录写回模型
bool QSqlTableModel::setRecord(int row, const QSqlRecord &values);
法二:直接修改模型中的数据 ------ setData
//传入要修改的位置编号和内容
[override virtual] bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
//通过行和列求编号
[override virtual] QModelIndex QAbstractTableModel::index(int row, int column, const QModelIndex &parent = ...) const;
7.撤销修改 ------ revert/revertAll
[override virtual slot] void QSqlTableModel::revert();
[slot] void QSqlTableModel::revertAll();
QSqlTableModel *model;//数据库数据模型QSqlDatabase db;//添加数据库驱动
db = QSqlDatabase::addDatabase("QSQLITE");
//指定数据库文件路径
db.setDatabaseName("stu.db");
//打开数据库
if(!db.open()){QMessageBox::warning(this,"提示","打开数据库失败");
}//初始化模型
model = new QSqlTableModel(this);
//绑定模型和表格界面
ui->tableView->setModel(model);//建表
void SmartSQLStu::on_pushButton_create_clicked()
{QString sql = QString("create table if not exists %1(id int unique,name ntext,age int)").arg(ui->lineEdit_tablename->text());//执行sql ------ QSqlQuery对象在要执行时创建QSqlQuery query;if(!query.exec(sql)){QMessageBox::warning(this,"提示","建表失败!");return;}model->setTable(ui->lineEdit_tablename->text());//设置提交后生效model->setEditStrategy(QSqlTableModel::OnManualSubmit);//显示model->select();//禁止表名输入框和建表按钮ui->lineEdit_tablename->setEnabled(false);ui->pushButton_create->setEnabled(false);
}//添加
void SmartSQLStu::on_pushButton_insert_clicked()
{//获取当前行数int row = model->rowCount();model->insertRow(row);//最后一行后插入int id = 100;model->setData(model->index(row,0),id);//提交model->submitAll();
}//保存
void SmartSQLStu::on_pushButton_save_clicked()
{model->submitAll();
}//撤销
void SmartSQLStu::on_pushButton_revert_clicked()
{model->revertAll();
}//删除
void SmartSQLStu::on_pushButton_delete_clicked()
{//从表格中获取要删除的行int delrow = ui->tableView->currentIndex().row();//删除改行model->removeRow(delrow);//询问询问用户是否真的删除if(QMessageBox::Yes==QMessageBox::warning(this,"删除","确定删除本行吗?",QMessageBox::Yes|QMessageBox::No)){model->submitAll();}else{//撤销model->revert();}
}
//查询
void SmartSQLStu::on_pushButton_select_clicked()
{model->setTable(ui->lineEdit_tablename->text());model->select();
}
5.QSqlQueryModel
QSqlQueryModel作为数据模型从数据库里查询数据,只需要使用setQuery()函数设置一个select查询语句即可。
用QSqlQueryModel::setQuery设置sql查询
void QSqlQueryModel::setQuery ( const QSqlQuery & query )
void QSqlQueryModel::setQuery ( const QString & query, const QSqlDatabase & db = QSqlDatabase() )
QSqlQueryModel *sql_model = new QSqlQueryModel;
sql_model->setQuery("SELECT* FROM user_table");tabelview->setModel(sql_model);
tabelview->setEditTriggers(QAbstractItemView::NoEditTriggers);
五、数据库简单加密
MD5是一种将任意长度的数据变换得到128位2进制数据,无法通过128位2进制数据求的原始数据的加密方式。
1.创建一个加密对象 //需要添加头文件<QCryptographicHash>
QCryptographicHash hash(QCryptographicHash::Md5);
2.放入要加密的数据
void QCryptographicHash::addData(const QByteArray &data); //hash.addData(password.toUtf8());
3.获取加密结果
QByteArray QCryptographicHash::result() const;
//hash.result();
将用户注册的密码进行加密
//对密码进行Md5的加密//1.创建QCryptographicHash加密对象QCryptographicHash hash(QCryptographicHash::Md5);//2.放入要加密的数据hash.addData(password.toUtf8());//3.取出加密结果QByteArray arr = hash.result();password = arr.toHex();qDebug()<<password;
QT之SQLITE3数据库相关推荐
- 27.Qt操作sqlite3数据库
1 sqlite3操作编程 问题1 驱动无法加载 QSqlDatabase: QSQLITE driver not loaded 解决办法将Qt自带安装目录下的sql文件拷贝到可执行文件目录下. 2 ...
- 08.QT中sqlite3数据库基本操作
Qt版本数据库操作 1 创建项目时选择sql模块 2 简易效果图如下 3 代码如下图所示 #include "SqliteDemo.h" #include <QtSql/QS ...
- Qt(C++)中如何连接sqlite3数据库及如何使用
第一步 引入相关文件 ①将sqlite一些对应的文件复制到qt的工程文件 ②在工程配置文件.pro中加入 LIBS += $$PWD/lib/sqlite3.lib $$:表示当前工程目录 第二步 在 ...
- qt读取数据库数据并验证_QT快速读取显示SQLite3数据库数据
(本文为本人原创,请尊重个人劳动成果.未经本人许可,严禁转载!) SQLite3是一个轻量级的文件数据库,拥有其他数据库无可比拟的高效率,其自身的C语言API已经能够满足大多数应用.蛋似,想要将数据直 ...
- QT操作sqlite数据库汇总
QT自带的QSqlite数据库中实现id主键自增长 QSqlite是QT自带的轻量级数据库,使用起来非常方便,对系统环境也没有任何的环境要求,可移植性非常好,适合数据量不是太大,要求不是太高的程序.本 ...
- qt连接mysql数据库原理_Qt连接数据库的两种方法
我曾经想过,无论在哪个平台下开发,都不要再接触SQL Server了,但显然不行.我们是来看世界的,不是来改变世界的,想通就好. 前两天,尝试了一下Qt下远程访问数据库.在macOS下,用Qt 5.1 ...
- QT 访问sqlite数据库
QT 访问sqlite数据库 1.sqlite数据库安装 首先,通过sqlite3命令查看 sqlite数据库是否已经安装,若没有安装,则通过 sudo apt install 指令进行安装. 2.准 ...
- sqlite3数据库最大可以是多大?可以存放多少数据?读写性能怎么样?
本文是转载自:sqlite3数据库最大可以是多大?可以存放多少数据?读写性能怎么样? sqlite是款不错的数据库,使用方便,不需要事先安装软件,事先建表.很多人担心它的性能和数据存储量问题. 比如有 ...
- Qt操作SQLite数据库的三种方式
Qt访问Sqlite数据库的三种方式(即使用三种类库去访问),分别为QSqlQuery.QSqlQueryModel.QSqlTableModel,对于这三种类库,可看为一个比一个上层,也就是封装的更 ...
最新文章
- C#中调用C++ 动态链接库 dll 的方法
- presto 连接mysql,Presto等同于MySQL group_concat
- 文献记录(part45)--Pedestrian detection with super-resolution reconstruction for low-quality image
- 离散信号的抽取和内插例题_《数字信号处理》学习指导与题解 2011年版
- 自回归AR模型、移动平均MA模型、自回归移动平均ARMA模型
- 时间管理 SMART 与 四象限
- 21点游戏java实现
- JAVA 常见的类集之CollectionListQueue
- 用粉红噪声煲机_煲机知识 | 煲机常用的粉红噪音和白噪音是什么?
- 手机 android.downloader病毒,Android手机出现史上最强木马 感染后无法删除
- Hash算法及数字签名【六】
- 前端实现 导出图片,导出PDF(截图原理)
- 计算机辅助教学应用于哪些方面,计算机辅助教学在英语教学中的运用
- 华为OD机试题:按区间反转文章片段
- STM32开发基础知识——定时器
- win10自带Groove音乐不能播放CUE和APE文件的一种曲线救国办法,自己创建aimppack插件包,AIMP安装DSP插件
- Robbers' watch【Codeforces 686 C】【DFS】
- 笔记本电脑安装CentOS7
- 'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件。
- 嵌入式IDE-MRS入手使用分享
热门文章
- 博达交换机S2528PB常用配置命令
- 主题:一个中专生:我在华为面试的真实经历,转http://www.javaeye.com/topic
- 【支付】微信小程序 微信支付 uniapp
- 韩商言房子卖价有多高,做现女友就有多难?
- 东方财富股票接口解析优缺点
- 折腾开源WRT的AC无线路由之路-3
- 拆解SSK SCRM330 USB3.0读卡器 GL3233 固件 0819
- 苹果怎么登录服务器未响应,王者荣耀登陆游戏服务器未响应该怎么解决 王者荣耀无法登陆解决办法...
- ElasticJob源码部分解读-Zookeeper建立连接
- js-打印1-100以内的质数(素数)