前言
SQlite是一款轻量级的数据库,可以集成在其他软件中,十分适合在嵌入式系统中使用。
在Qt5以上版本中可以直接使用,Qt5中带有SQlite的驱动。
用法
1.准备工作
1.引入sql模块:在Qt的项目文件(.pro文件)中,加入sql模块
QT += sql
2.添加相关头文件
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
2.建立数据库
QSqlDatabase database;
database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("stu.db");
database.setUserName("root");
database.setPassword("123456");
上述代码解释:
1.第一行中建立了一个database对象,后续的操作需要使用这个对象。
2.创建数据库连接,使用addDatabase来创建一个连接,注意QSQLITE是SQlite对应的驱动名,不能更改。
3.设置数据库名字,这里设置为stu.db,如果这个数据库存在那么后续会在原来的数据库上进行操作,否则将创建stu.db
4.设置用户名和密码,可省略。
3.打开和关闭数据库
使用open函数打开,如果打开成功返回true,打开失败返回false
使用close关闭数据库
if(!database.open())
{
qDebug()<<database.lastError(); //如果打开失败,打印错误信息
}
else
{
//处理打开成功后的逻辑
}
database.close(); //关闭
4.操作数据库
对数据库的操作需要用到QSqlQuery类,操作前需要定义一个变量。
下面通过几个例子来简单介绍操作方法。
例1:创建一个student的表,里面包括三列,第一列为id,第二列为name,第三列为age。
QSqlQuery sql_query;
//int类型自增长要使用INTEGER AUTOINCREMENT自增长
QString q_create = "create table if not exists student (id INTEGER primary key AUTOINCREMENT, name varchar(30), age int)";
sql_query.prepare(q_create);
if(!sql_query.exec())
{
qDebug() << sql_query.lastError();
}
else
{
//创建好之后的操作
}
代码说明:
1.创建一个QSqlQuery类,后续操作数据库需要用到它。
2.当student表没有的时候创建它。
3.id要让他实现自增长所以要设为INTEGER类型,通过AUTOINCREMENT属性将其设为自增长,primary key设为主键
4.name类型设为varchar(30)即字符数组,里面最多能存30个字符。
5.age设为int类型。
注:对数据库操作都是通过sqlite语句进行的,上述代码通过一个QString类型的变量来保存这个语句,通过prepare函数保存到QSqlQuery对象中,并通过sql_query.exec()来判断是否执行成功,如果返回true则执行成功。也可直接以写在exec函数中,如:sql_query.exec(“create table if not exists student (id INTEGER primary key AUTOINCREMENT, name varchar(30), age int)”)
例2:插入数据
QString q_insert = "insert into student(name,age) values (?,?)";
sql_query.prepare(q_insert);
sql_query.addBindValue("小米");
sql_query.addBindValue(18);
if(!sql_query.exec())
{
qDebug()<<sql_query.lastError();
}
if(!sql_query.exec("insert into student(name,age) values (\"小红\",21)"))
{
qDebug()<<sql_query.lastError();
}
代码说明:
1.这里使用两种插入语句进行插入,第一种是利用一个QString对象来保存sqlite语句,然后使用prepare来保存到QSqlQuery中,第二种是直接在exec中书写。
2.sqlite语句为insert into <表名>(字段名,字段名……) value(值1,值2……)
3.因为这里的id是自增长类型,所以不用对他赋值,他的值会自动加一,所以这里的字段名为name和age。
4.q_insert里面的?号位置,是需要下面的addBindValue里面的值来取代的,替代顺序和addBindValue的调用顺序一致。
5.第二种方法是直接在sql_query.exec中书写完整语句。
例3.修改数据
if(!sql_query.exec("update student set age = 233 where id = 4"))
{
qDebug()<<sql_query.lastError();
}
代码说明:
修改student表中id为4的age值为233
例4:查询数据
QString q_select = "select * from student";
sql_query.prepare(q_select);
if(!sql_query.exec())
{
qDebug()<<sql_query.lastError();
}
else
{
while (sql_query.next())
{
int id = sql_query.value(0).toInt();
QString name = sql_query.value(1).toString();
int age = sql_query.value(2).toInt();
qDebug()<<"id"<<id<<"\t"<<"name"<<name<<"\t"<<"age"<<age;
}
}
代码说明:
1.通过select * from 表名 语句查询表中的所以数据。
2.可通过where来控制查找哪一行例如select * from student where id = 1
3.查询到之后,通过sql_query.next()来控制循环条件依次取出数据,注意这里的类型转换,因为id为int类型,所以转为int,name和age也一样。value(0)表示每一行的第一个数据这里是id,value(1)和value(2)以此类推为name和age的值。
例5.删除数据
sql_query.exec("delete from student where id=2")
删除id值为2的数据。
这里我们使用了sql语句对数据库进行了常见的操作,包括增删改查。更多更复杂的应用就需要参考SQlite的相关文档了,这里不再赘述。