sqlite
本文主要是讲解一下sqlite的基础使用,主要是应用在Qt上面

SLQ语句
创建,打开数据库
sqlite3 *.db

退出数据库
.quit 或 .exit
对数据库中表及内容操作的语句
QT数据库
要使用qt的sqlite数据库,需要在pro文件里面添加sql类
QT += core gui sql
Qtsqlite数据库接口
QSqlDatabase建立数据库连接
QSqlDatabase 用于建立与数据库的连接,在建立连接时,加载数据库驱动的时候,可以设置数据库类型和数据库名字。除此以外,还可以通过接口设置数据库名字,主机名,用户名和密码
在.h文件中设置对象,一个数据库就对应一个对象
QSqlDatabase db;
在构造函数中初始化对象
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
db = QSqlDatabase::addDatabase("QSQLITE");//告诉系统连接的数据库时sqlite3数据库,连接成功,返回一个数据库对象
db.setDatabaseName("test.db");//数据库文件后缀为.db
//打开数据库
if(!db.open())
{
qDebug() << "failed to open" << db.lastError();//数据库的专门的报错
}
}
QSqlQuery执行各种SQL语句
访问数据库的操作主要包括:
- 创建表
- 向数据库表中插入数据
- 删除数据
- 更新数据
- 查询数据
创建数据库
数据库中的表通常只需要创建一次,而其他操作是可以重复的
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QtSql/QSqlError>
#include <QtSql/QSqlQuery>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
db = QSqlDatabase::addDatabase("QSQLITE");//告诉系统连接的数据库时sqlite3数据库,连接成功,返回一个数据库对象
db.setDatabaseName("test.db");//数据库文件后缀为.db
//打开数据库
if(!db.open())
{
qDebug() << "failed to open" << db.lastError();//数据库的专门的报错
}
QSqlQuery query;//在创建该对象时系统会自动完成跟数据库的关联
//定义一条创建表的sql语句,表名:staff 表中字段:id name age
QString sqlCreate = QString("create table staff(id integer primary key autoincrement,"
"name varchar(20),"
"age int);");
//执行命令语句
query.exec(sqlCreate);
}
Widget::~Widget()
{
delete ui;
}
插入

values前面要有一个空格
//插入操作
//注意里面的字符串要用单引号
QString sqlInsert = QString("insert into staff(name,age) values('张三',20);");
if(!query.exec(sqlInsert))
{
qDebug() << "insert table fail" << db.lastError();
}
查询

QString sqlSelect = QString ("select * from staff;");
if(!query.exec(sqlSelect))
{
qDebug() << "insert data error" << db.lastError();
}
else
{
while(query.next())//转到下一条
{
qDebug() << query.value("name").toString() << endl;
qDebug() << query.value("age").toInt() << endl;
}
}
为什么需要调用 next()? 在 SQL 查询中,结果集可能包含多行数据。即使 COUNT(*) 只返回一行,也必须通过 next() 将指针移动到结果集的第一行才能读取数据。 如果不调用 next(),直接访问 value() 会出错。
删除

//删除操作
QString sqlDelete = QString("delete from staff where id = 2");
if(!query.exec(sqlDelete))
{
qDebug() << "insert data error" << db.lastError();
}
更新操作

//更新操作
QString sqlUpdate = QString("update staff set name = '李四' where id = 3");
if(!query.exec(sqlUpdate))
{
qDebug() << "update data error" << db.lastError();
}
QSqlQueryModel
功能:以只读访问查询数据库数据,并把数据库存放在一个结果集,数据不能修改,如果想要进行修改需要进行其他操作(重写虚函数)
//根据需求创建一个表
QSqlQuery query;
QString sqlCreateTable = QString("create table staff(id integer primary key autoincrement,"
"name varchar(20),"
"age int,"
"address varchar(50),"
"salary int);");
query.exec(sqlCreateTable);
QString sqlInsert = QString("insert into staff(name,age,address,salary)"
"values('张三',20,'四川',1000)");
if(!query.exec(sqlInsert))
{
qDebug() << "Error insert into data" << db.lastError();
}
//使用QsqlQueryModel来高效的查询数据库操作
//【1】创建QSqlqueryModel对象,设置相关表头信息
QSqlQueryModel *model = new QSqlQueryModel;
//执行sql语句,将查询出来的结果转换为model对象
model->setQuery("select name,age,address,salary from staff");
//根据需求设置表头信息
model->setHeaderData(0,Qt::Horizontal,"Name");
model->setHeaderData(1,Qt::Horizontal,"Age");
model->setHeaderData(2,Qt::Horizontal,"Address");
model->setHeaderData(3,Qt::Horizontal,"Salary");
//给ui控件设置一个模型
QTableView *view = new QTableView(this);
view->setModel(model);