前言

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的相关文档了,这里不再赘述。