目录

一、数据库简介

二、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数据库相关推荐

  1. 27.Qt操作sqlite3数据库

    1 sqlite3操作编程 问题1 驱动无法加载 QSqlDatabase: QSQLITE driver not loaded 解决办法将Qt自带安装目录下的sql文件拷贝到可执行文件目录下. 2 ...

  2. 08.QT中sqlite3数据库基本操作

    Qt版本数据库操作 1 创建项目时选择sql模块 2 简易效果图如下 3 代码如下图所示 #include "SqliteDemo.h" #include <QtSql/QS ...

  3. Qt(C++)中如何连接sqlite3数据库及如何使用

    第一步 引入相关文件 ①将sqlite一些对应的文件复制到qt的工程文件 ②在工程配置文件.pro中加入 LIBS += $$PWD/lib/sqlite3.lib $$:表示当前工程目录 第二步 在 ...

  4. qt读取数据库数据并验证_QT快速读取显示SQLite3数据库数据

    (本文为本人原创,请尊重个人劳动成果.未经本人许可,严禁转载!) SQLite3是一个轻量级的文件数据库,拥有其他数据库无可比拟的高效率,其自身的C语言API已经能够满足大多数应用.蛋似,想要将数据直 ...

  5. QT操作sqlite数据库汇总

    QT自带的QSqlite数据库中实现id主键自增长 QSqlite是QT自带的轻量级数据库,使用起来非常方便,对系统环境也没有任何的环境要求,可移植性非常好,适合数据量不是太大,要求不是太高的程序.本 ...

  6. qt连接mysql数据库原理_Qt连接数据库的两种方法

    我曾经想过,无论在哪个平台下开发,都不要再接触SQL Server了,但显然不行.我们是来看世界的,不是来改变世界的,想通就好. 前两天,尝试了一下Qt下远程访问数据库.在macOS下,用Qt 5.1 ...

  7. QT 访问sqlite数据库

    QT 访问sqlite数据库 1.sqlite数据库安装 首先,通过sqlite3命令查看 sqlite数据库是否已经安装,若没有安装,则通过 sudo apt install 指令进行安装. 2.准 ...

  8. sqlite3数据库最大可以是多大?可以存放多少数据?读写性能怎么样?

    本文是转载自:sqlite3数据库最大可以是多大?可以存放多少数据?读写性能怎么样? sqlite是款不错的数据库,使用方便,不需要事先安装软件,事先建表.很多人担心它的性能和数据存储量问题. 比如有 ...

  9. Qt操作SQLite数据库的三种方式

    Qt访问Sqlite数据库的三种方式(即使用三种类库去访问),分别为QSqlQuery.QSqlQueryModel.QSqlTableModel,对于这三种类库,可看为一个比一个上层,也就是封装的更 ...

最新文章

  1. C#中调用C++ 动态链接库 dll 的方法
  2. presto 连接mysql,Presto等同于MySQL group_concat
  3. 文献记录(part45)--Pedestrian detection with super-resolution reconstruction for low-quality image
  4. 离散信号的抽取和内插例题_《数字信号处理》学习指导与题解 2011年版
  5. 自回归AR模型、移动平均MA模型、自回归移动平均ARMA模型
  6. 时间管理 SMART 与 四象限
  7. 21点游戏java实现
  8. JAVA 常见的类集之CollectionListQueue
  9. 用粉红噪声煲机_煲机知识 | 煲机常用的粉红噪音和白噪音是什么?
  10. 手机 android.downloader病毒,Android手机出现史上最强木马 感染后无法删除
  11. Hash算法及数字签名【六】
  12. 前端实现 导出图片,导出PDF(截图原理)
  13. 计算机辅助教学应用于哪些方面,计算机辅助教学在英语教学中的运用
  14. 华为OD机试题:按区间反转文章片段
  15. STM32开发基础知识——定时器
  16. win10自带Groove音乐不能播放CUE和APE文件的一种曲线救国办法,自己创建aimppack插件包,AIMP安装DSP插件
  17. Robbers' watch【Codeforces 686 C】【DFS】
  18. 笔记本电脑安装CentOS7
  19. 'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件。
  20. 嵌入式IDE-MRS入手使用分享

热门文章

  1. 博达交换机S2528PB常用配置命令
  2. 主题:一个中专生:我在华为面试的真实经历,转http://www.javaeye.com/topic
  3. 【支付】微信小程序 微信支付 uniapp
  4. 韩商言房子卖价有多高,做现女友就有多难?
  5. 东方财富股票接口解析优缺点
  6. 折腾开源WRT的AC无线路由之路-3
  7. 拆解SSK SCRM330 USB3.0读卡器 GL3233 固件 0819
  8. 苹果怎么登录服务器未响应,王者荣耀登陆游戏服务器未响应该怎么解决 王者荣耀无法登陆解决办法...
  9. ElasticJob源码部分解读-Zookeeper建立连接
  10. js-打印1-100以内的质数(素数)