1.sqlite的优点
SQLite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,非常适合嵌入式系统。
Qt5以上版本可以直接使用SQLite。
2.sqlite的使用
修改.pro文件,添加sql
QT += sql
添加头文件
#include "QSqlDatabase"
#include "QSqlQuery"
#include "QSqlError"
#include "QDebug"
void MainWindow::connect_sqlite()
{
QSqlDatabase database;
database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("MyDataBase.db"); //设置数据库名
if (!database.open()){
qDebug() << "Error: Failed to connect database." << database.lastError();
}else{
qDebug() << "Succeed to connect database." ;
}
//创建表
QSqlQuery sql_query;
//不存在则创建表
if(!sql_query.exec("CREATE TABLE information(type varchar(20),time varchar(20),tick int(32),slot1 varchar(32),slot2 varchar(32),slot3 varchar(32),slot4 varchar(32),slot5 varchar(32),slot6 varchar(32),slot7 varchar(32),slot8 varchar(32),slot9 varchar(32),slot10 varchar(32),slot11 varchar(32),slot12 varchar(32) )")){
qDebug() << "Error: Fail to create table."<< sql_query.lastError();
}else{
qDebug() << "Table created!";
}
if(!sql_query.exec("CREATE TABLE information8003(type varchar(20),time varchar(20),tick int(32),slot1 varchar(32),slot2 varchar(32),slot3 varchar(32),slot4 varchar(32),slot5 varchar(32),slot6 varchar(32),slot7 varchar(32),slot8 varchar(32),slot9 varchar(32),slot10 varchar(32),slot11 varchar(32),slot12 varchar(32) )")){
qDebug() << "Error: Fail to create table."<< sql_query.lastError();
}else{
qDebug() << "Table created!";
}
if(!sql_query.exec("CREATE TABLE information8004(type varchar(20),time varchar(20),tick int(32),slot1 varchar(32),slot2 varchar(32),slot3 varchar(32),slot4 varchar(32),slot5 varchar(32),slot6 varchar(32),slot7 varchar(32),slot8 varchar(32),slot9 varchar(32),slot10 varchar(32),slot11 varchar(32),slot12 varchar(32))")){
qDebug() << "Error: Fail to create table."<< sql_query.lastError();
}else{
qDebug() << "Table created!";
}
}
向数据库插入数据
void SqlitLog::recLog()
{
QSqlQuery query;
if(QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions)) //先判断该数据库是否支持事务操作
{
if(QSqlDatabase::database().transaction()) //启动事务操作
{
//QString recMsg = QString("insert into information values(\"aaaa\",\"bbbb\",\"cccc\")");
QString recMsg = QString("insert into information values('%1','%2','%3')")
.arg("aaaa").arg("bbbb").arg("cccc");
query.exec(recMsg); //数据库执行SQL语句
if(!QSqlDatabase::database().commit())
{
qDebug() << QSqlDatabase::database().lastError(); //提交失败的错误
if(!QSqlDatabase::database().rollback())
qDebug() << QSqlDatabase::database().lastError(); //回滚失败的错误
}
}
}
}
//当数据量小时,可以不要启动事务操作,可以直接执行query.exec(recMsg);
//当数据量大时,启动事务操作可以节省大量时间
删除数据
和添加数据类似,将添加语句改为删除语句即可,根据自己需求写入删除语句
QSqlQuery query;
QString recMsg = QString("delete from information where id = 1");
query.exec(recMsg);
更新数据
和以上类似
QSqlQuery query;
QString recMsg = QString("update information set type = \"0x8004\" where id = 1");
query.exec(recMsg);
查询语句
QSqlQuery query;
QString recMsg = QString("select * from information");
QSqlRecord record;
QString drawData;
QStringList drawTimeList;
QStringList drawTickList;
query.exec(recMsg);
//循环获取模型中每一行的数据
while(query.next()){
record = query.record();
//每一个slot的前面24位为输入/输出点的数据,然后选择相应的输入/输出点
drawData.append(record.value(QString("slot%1").arg(slot + 1)).toString().at(id)); //选择对应IO板中对应IO点的数据
drawTimeList.append(record.value("time").toString()); //获取数据中每一行的时间并插入链表
drawTickList.append(record.value("tick").toString()); //获取数据中每一行的tick值并插入链表
}
删除表
if(!sql_query.exec("drop table student"))
{
qDebug() << sql_query.lastError();
}else{
qDebug() << "table cleared";
}
关闭数据库
QSqlDatabase::database().close();