使用QT写数据到QSLite中。
#include <QSqlDatabase>
#include <QObject>
#include <QDebug>
// 假设数据库名为MYSQLITE, 字段为MYSQLITE1, MYSQLITE2
int main(void) {
QSqlDatabase *m_pDB = new QSqlDatabase();
*m_pDB = QSqlDatabase::addDatabase("QSQLITE", "WUMING");
QString strSqlPath = u8"D:/TEST.db";
m_pDB->setDatabaseName(strSqlPath);
if (!m_pDB->open()) {
qDebug() << u8"数据库打开失败";
return -1;
}
QSqlQuery query(*m_pDB);
// 插入数据
for (int i = 0; i < 100000; ++i) {
QString strSqlText = QString(u8"insert into \"MYSQLITE\"(\"MYSQLITE1\", \"MYSQLITE2\") VALUES ('1', '2')");
if (!query.exec(strSqlText)) {
qDebug() << u8"插入数据失败";
return -1;
}
}
return 0;
}
以上代码可以实现对QSLite简单的数据插入,但是如果是100000条循环插入时,将会导致很慢很慢,原因:exec每次执行都会对db文件的一次打开和关闭,导致耗时较高。如果减少耗时只能通过对文件减少打开和关闭次数,从而减少耗时。这样就可以通过事务的方式来解决该问题。
#include <QSqlDatabase>
#include <QObject>
#include <QDebug>
// 假设数据库名为MYSQLITE, 字段为MYSQLITE1, MYSQLITE2
int main(void) {
QSqlDatabase *m_pDB = new QSqlDatabase();
*m_pDB = QSqlDatabase::addDatabase("QSQLITE", "WUMING");
QString strSqlPath = u8"D:/TEST.db";
m_pDB->setDatabaseName(strSqlPath);
if (!m_pDB->open()) {
qDebug() << u8"数据库打开失败";
return -1;
}
QSqlQuery query(*m_pDB);
// 开启事务
m_pDB->transaction();
// 插入数据
for (int i = 0; i < 100000; ++i) {
QString strSqlText = QString(u8"insert into \"MYSQLITE\"(\"MYSQLITE1\", \"MYSQLITE2\") VALUES ('1', '2')");
if (!query.exec(strSqlText)) {
qDebug() << u8"插入数据失败";
m_pDB->rollback(); // 设置回滚,不更改数据库内容。可以理解i之前执行成功的均撤回
return -1;
}
}
m_pDB->commit(); // 提交事务,将所有的内容全部提交
return 0;
}
以上代码,执行后先将需要写入文件的内容先写入内存,然后再一次写入文件中。这种方式将只会打开一次db文件,所以耗时较少。从而解决大量数据写入时写入缓慢问题。