回顾:
第一章:Qt的概述
第二章:在Ubuntu编写第一个Qt程序
第三章:Qt的字符串和字符编码
第四章:Qt的信号和槽
第五章:Qt容器窗口(父窗口)
第六章:面向对象的Qt编程
第七章:Qt设计师使用(designer)
第八章:Qt创造器的使用(qtcreator)
第九章:资源和图像
第十章:目录与定时器
第十一章:鼠标和键盘事件
Qt数据库(sqlite)
1、数据库简介//了解
- 1)概念:数据库是指以一定方式存储在一起,能为多个用户共享,具有仅能小的冗余度的特性,是与应用程序彼此独立的数据集合。
- 2)数据库相关的术语
- DB 数据库
- DBA 数据库管理员
- DBMS 数据库管理系统
- RDB 关系型数据库
- RDBMS 关系型数据管理系统
- 3)数据库类型
- 层次式数据库
- 网络式数据库
- 关系型数据库
- 4)常见数据库
- Oracle,市场占有率50%
- IBM的DB2,市场占有率20%
- 微软的SqlServer,市场占有率15%
- Sun公司的MySQL
- SQLite,轻量级嵌入式数据库
- 5)数据库查询语言(SQL)
2、SQLite数据库
2.1、安装SQLite
- 在线安装(推荐): sudo apt-get install sqlite3
- 离线安装:sudo dpkg -i sqlite.xx.deb
- 测试:在终端输入
sqlite3
,即可进入sqlite的命令操作界面
使用.exit
可以退出控制终端
注: 在sqlite3
命令行界面可以输入两种指令,一种是sqlite自身的配置和格式控制等相关指令,以"."
开头,可以使用".help"
查看这些指令的详细说明;还有一种是SQL指令,实现对数据的增删改查等相关操作。
2.2、常见的sqlite指令
- 1)
.database
查看数据库名字和对应的文件 - 2)
.tables
查看当前数据库包含的数据表 - 3).
schema
查看创建数据表的信息 - 4)
.mode 显示模式
,设置数据显示模式(list/tabs/column) - 5)
.nullvalue "string"
设置空白位置显示的字符串 - 6)
.backuo
文件名,备份数据库到指定的文件中 - 7)
.exit/.quit
退出
注:ctrl+L
可以清屏SELECT * FROM company;
//查看company中全部内容
3、在命令行使用sql命令操作数据库//重点
- 1)创建数据表,语法:
CREATE TABLE 表名(
列名1 类型 约束,
列名2 类型 约束,
...
列名n 类型 约束
);
类型:INT(整型)、TEXT(字符串)、REAL(浮点数)
约束:NOT NULL(非空);UNIQUE(唯一);PRIMARY KEY(主键),包含唯一性,同时可以加快对数据的访问
- 2)删除表:
DROP TABLE 表名;
注: 慎用,因为数据库表一旦删除,里面包含的数据也将消失
- 3)插入数据,语法:
INSERT INTO 表名
(列名1, 列名2, ..., 列名n)
VALUES (数值1, 数值2, ..,数值n);
eg:
insert into student (id, name, scorc) values (10002, "weeks", 98);
- 4)删除数据,语法:
DELETE FROM 表名 wehere 条件表达式;
eg:
delete from student where id=10002;
- 5)修改数据,语法:
UPDATE 表名 SET 列名1=新数值, 列名2=新数值.. WHERE 表达式;
eg:
update student set score=100 where id=10001;
- 6)查询操作,语法
SELECT 列名1, 列名, ..., 列名n FROM 表名;
//或者
SELECT 列名1, 列名, ..., 列名n FROM 表名 WHERE 条件表达式;
//或者
SELECT 列名1, 列名, ..., 列名n FROM 表名 WHERE 条件表达式 ORDER BY 列名 排序方式;//排序方式有ASC(升序),DESC(降序)
eg:
select * from company where salary>=8000 or salary<3000;
4、在Qt中使用Sqlite数据库
- 1)QSqlDatabase:建立Qt程序和数据库的连接
//添加数据库驱动
QSqlDatebase db = QSqlDatabase::addDatabase("QSQLITE");
//设置数据库的名字,对于sqlite就是".db"数据文件
db.setDatabase("custom.db");
//打开数据库
bool ok = db.open();
- 2)QSqlQuery:提供SQL命令的操作和执行方法
QSqlQuery query;
QString str("str字符串");
query.exec(str);
- 3)QSqlQueryModel:执行查询的SQL语句和遍历结果集
QSqlQueryModel *model = new QSqlQueryModel;
//执行select语句并保存结果集到model
model->setQuery("SELECT 语句");
model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Salary"));
//显示结果QTableView
QTableView *view = new QTableView;
view->setModel(model);
view->show();
案例:学上成绩管理系统
- SqliteDialog.h
#ifndef SQLITEDIALOG_H
#define SQLITEDIALOG_H
#include <QDialog>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlQueryModel>
#include <QSqlError>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class SqliteDialog; }
QT_END_NAMESPACE
class SqliteDialog : public QDialog
{
Q_OBJECT
public:
SqliteDialog(QWidget *parent = nullptr);
~SqliteDialog();
private:
//
void createDB(void);
//
void createTable(void);
//
void queryTable(void);
private slots:
void on_sortButton_clicked();
void on_insertButton_clicked();
void on_deleteButton_clicked();
void on_updateButton_clicked();
private:
Ui::SqliteDialog *ui;
QSqlDatabase db;//
QSqlQueryModel model;//
};
#endif // SQLITEDIALOG_H
- SqliteDialog.cpp
#include "SqliteDialog.h"
#include "ui_SqliteDialog.h"
SqliteDialog::SqliteDialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::SqliteDialog)
{
ui->setupUi(this);
createDB();
createTable();
queryTable();
}
SqliteDialog::~SqliteDialog()
{
delete ui;
}
// sort slot
void SqliteDialog::on_sortButton_clicked()
{
QString value = ui->valueCombox->currentText();
QString com = ui->condCombox->currentText();
QString str = QString(
"SELECT * FROM student"
"ORDER BY %1 %2").arg(value).arg(com);
model.setQuery(str);
//show result
ui->tableView->setModel(&model);
}
//insert slot
void SqliteDialog::on_insertButton_clicked()
{
QSqlQuery query;
//get id,name, score
int id = ui->idEdit->text().toInt();
QString name = ui->nameEdit->text();
double score = ui->scoreEdit->text().toDouble();
QString str = QString(
"INSERT INTO student"
"(id, name, score)"
"VALUES (%1,'%2',%3)"
).arg(id).arg(name).arg(score);
query.exec(str);
queryTable();
}
//delete slot
void SqliteDialog::on_deleteButton_clicked()
{
QSqlQuery query;
//get id
int id = ui->idEdit->text().toInt();
QString str = QString(
"DELETE FROM student WHERE id=(%1)").arg(id);
query.exec(str);
queryTable();
}
//update slot
void SqliteDialog::on_updateButton_clicked()
{
QSqlQuery query;
//get id
int id = ui->idEdit->text().toInt();
double score = ui->scoreEdit->text().toDouble();
QString str = QString(
"UPDATE student SET score=(%1) WHERE id=(%2)").arg(score).arg(id);
query.exec(str);
queryTable();
}
//creat databas
void SqliteDialog::createDB(void)
{
//create connect wit sqlite database
//1)add database drive
db = QSqlDatabase::addDatabase("QSQLITE");
//2)database's name
db.setDatabaseName("menu.db");
//3)open database
if(db.open()==false){
qDebug() << db.lastError();
}
}
//create data table
void SqliteDialog::createTable(void)
{
QSqlQuery query;
QString str = QString(
"CREATE TABLE student ("
" id INT PRIMARY KEY,"
"name TEXT NOT NULL,"
"score REAL NOT NULL)");
//"abc""bcd"==>"abcbcd"
//qDebug() << str;
query.exec(str);
}
//query table data
void SqliteDialog::queryTable(void)
{
QString str = QString("SELECT * FROM student");
//execute str corresponding sql and save result
model.setQuery(str);
//show result
ui->tableView->setModel(&model);
}