【Qt-21】Qt操作sqlite数据库

本文介绍了在QT中使用QSqlQuery操作SQLite数据库的基础语法,包括创建表、判断表存在、常用方法执行以及在实践中遇到的错误处理,如删除重复值、查找最新值和清理90天前数据。还涉及了与MySQL的比较和错误代码解析。
摘要由CSDN通过智能技术生成

QT操作sqlite数据库语句与mysql数据库雷同,这里不再赘述,请参考【QT-2】Qt连接及操作MySql数据库_qt连接mysql数据库-CSDN博客

目录

1、sqlite数据库使用

2、判断数据库中是否存在表

3、QSqlQuery提供的常用方法

4、在实践过程中的错误解决

5、删除查询结果的重复值

6、查找查询结果的最新值

7、删除90天前数据

8、删除表


1、sqlite数据库使用

QSqlQuery sql_qurey;
//添加驱动
database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("../3dvisionServer/project.db");
sql_qurey = QSqlQuery::QSqlQuery(database);
if (!database.open())
{
	qDebug() << "Error:Failed to connect database!" << database.lastError();
}
else
{
	qDebug() << "Link sucess!";
}

2、判断数据库中是否存在表

//project_conf为表名
bool isTableExist = sql_qurey.exec(QString("select * from project_conf"));
//返回true,则表存在;反之,表不存在
qDebug() << isTableExist;

3、QSqlQuery提供的常用方法

Qt对数据库的操作是通过QSqlQuery实现的,它可返回所有的执行结果。

next():指向下一条记录,每执行一次该函数,便指向相邻的下一条记录;

previous():指向上一条记录,每执行一次该函数,便指向相邻的上一条记录;

record():获得现在指向的记录;

first():指向结果集的第一条记录;

last():指向结果集的最后一条记录;

seek(int n):query指向结果集的第n条记录;

value(int n):获得属性值,其中n代表查询第n个属性,或者value("列名");

query.record().count():获取每条记录中属性(即列)的个数;

query.at():获取query所指向的记录在结果集中的编号;

query.record().indexOf("name"):获取name属性所在列的编号。

特别注意:将next()放在循环内,查询的记录从第二条开始。

4、在实践过程中的错误解决

错误1

QSqlQuery::exec: database not open
Error: Failed to create table! QSqlError("", "Driver not loaded", "Driver not loaded")

解决:

// 添加以下语句
sql_qurey = QSqlQuery::QSqlQuery(database);

错误2

Error: Failed to create table! QSqlError("1", "Unable to execute statement", "AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY")

错误代码:

QString sql_result = "create table result(result_id int PRIMARY KEY AUTOINCREMENT, result_silo_id int,\
		result_max varchar,result_min varchar, result_mean varchar, result_vol varchar, result_pervol varchar,\
		cloud_x varchar, cloud_y varchar, cloud_z varchar, datetime varchar)";

解决:

使用关键字AUTOINCREMENT必须满足:

1)、只能用于整型(INTEGER)字段,INT类型不可行;

2)、只能用于PRIMARY KEY字段。

正确写法:

QString sql_result = "create table result(result_id INTEGER PRIMARY KEY AUTOINCREMENT, result_silo_id int,\
		result_max varchar,result_min varchar, result_mean varchar, result_vol varchar, result_pervol varchar,\
		cloud_x varchar, cloud_y varchar, cloud_z varchar, datetime varchar)";

错误2:

QSqlQuery::value: not positioned on a valid record

错误代码:

QString sql_select = QString("select pro_id from project_conf where pro_name = '" + pro_name + "'");

qDebug() << sql_select;
if (sql_qurey.exec(sql_select))
{
	quint16 data = sql_qurey.value(0).toInt();
	qDebug() << data;     
}   

解决:

QSqlQuery返回的数据集,record是停在第一条记录之前。因此,获得数据集后,必须执行next()或first()到第一条记录,这时record才有效。

正确写法:

QString sql_select = QString("select pro_id from project_conf where pro_name = '" + pro_name + "'");

qDebug() << sql_select;
if (sql_qurey.exec(sql_select))
{
    //或者采用 if(sql_query.next()) 
	if (sql_qurey.first())
	{
		quint16 data = sql_qurey.value(0).toInt();
        //或者通过下面的写法
        quint16 data = sql_qurey.value("site_id").toInt();
		qDebug() << data;
    }
}

5、删除查询结果的重复值

select DISTINCT 列名 from 表名

6、查找查询结果的最新值

//列名2为按某列值进行排序,DESC降序排列,ASC升序排列,LIMIT 1为只读取一行数据
select * from 表名 where 列名1 = 列名值 ORDER BY 列名2 DESC LIMIT 1

7、删除90天前数据

//result为表名,datetime为列名
DELETE FROM result WHERE datetime < DATE('now', '-90 days')

8、删除表

DROP TABLE 表名

注:数据库删除某表后,文件大小没变化

//执行以下命令
VACUUM

9、查询数据库大小,并按日期备份

QString path = QDir::currentPath();
QString filePath = path + "/project.db";
QFileInfo fileInfo(filePath);
if (fileInfo.exists() && !fileInfo.isDir())
{
	qint64 sizeInBytes = fileInfo.size();
	double sizeInKB = static_cast<double>(sizeInBytes) / 1024;
	double sizeInMB = sizeInKB / 1024;
	double sizeInGB = sizeInMB / 1024;
	QString datetime = QDateTime::currentDateTime().toString("yyyy-MM-dd");
	qDebug() << "file size:" << sizeInBytes << "bytes (" << sizeInKB << "KB, " << sizeInMB << "MB, " << sizeInGB << "GB)";
	if (sizeInMB > 1000)
	{
		QString data1 = "select * from result ORDER BY datetime DESC LIMIT 1";
		QString data2 = "select * from result ORDER BY datetime ASC LIMIT 1";
		QString data_old, data_new;
		if (sql_qurey.exec(data1))
		{
			while (sql_qurey.next())
			{
				data_old = sql_qurey.value("datetime").toString().split(" ")[0];
				qDebug() << data_old;
			}
		}

		if (sql_qurey.exec(data2))
		{
			while (sql_qurey.next())
			{
				data_new = sql_qurey.value("datetime").toString().split(" ")[0];
				qDebug() << data_new;
			}
		}

		QString backupsFile = "project_" + data_old + "_" + data_new + ".db";
		qDebug() << backupsFile;
		bool result = QFile::copy(filePath, path + "/" + backupsFile);

		if (!result)
		{
			qDebug() << "Backup failed!";
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值