柚子快報(bào)激活碼778899分享:QT-Sqlite數(shù)據(jù)庫(kù)的使用
柚子快報(bào)激活碼778899分享:QT-Sqlite數(shù)據(jù)庫(kù)的使用
QT-Sqlite數(shù)據(jù)庫(kù)的使用
前言一、相關(guān)操作1.打開(kāi)數(shù)據(jù)庫(kù)2.關(guān)閉數(shù)據(jù)庫(kù)3.創(chuàng)建數(shù)據(jù)庫(kù)表4.刪除表5.執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句6.數(shù)據(jù)庫(kù)查詢(xún)7.數(shù)據(jù)庫(kù)插入8.模糊查詢(xún)
前言
使用Sqlite數(shù)據(jù)可以進(jìn)行一些本地參數(shù)獲取,臨時(shí)大數(shù)據(jù)存儲(chǔ)。需要注意的是,如果你后面發(fā)布版本的時(shí)候,需要使添加數(shù)據(jù)庫(kù)的依賴(lài),要不讓版本發(fā)布的時(shí)候,軟件可能使用不了數(shù)據(jù)庫(kù)的操作,然后一調(diào)試會(huì)發(fā)現(xiàn)數(shù)據(jù)沒(méi)有加載驅(qū)動(dòng)依賴(lài)。
一、相關(guān)操作
1.打開(kāi)數(shù)據(jù)庫(kù)
打開(kāi)數(shù)據(jù)庫(kù)的時(shí)候,同時(shí)也是會(huì)生成數(shù)據(jù)庫(kù)的的文件。 具體實(shí)例如下:
QSqlDatabase SqlLiteObject::openDatabase(QString strDatabaseName)
{
QString strDir = QString("%1/%2").arg("C:").arg("Database");
// 如果沒(méi)有文件夾,我們就先創(chuàng)建文件夾,用來(lái)放數(shù)據(jù)庫(kù)文件
QDir dir;
if (!dir.exists(strDir))
dir.mkpath(strDir);
m_strDatabaseName = strDatabaseName;
QSqlDatabase db;
if (QSqlDatabase::contains(m_strDatabaseName))
{
// 如果是已經(jīng)創(chuàng)建過(guò)了,就直接獲取就行了
db = QSqlDatabase::database(m_strDatabaseName);
}
else
{
// 這里就是創(chuàng)建數(shù)據(jù)庫(kù)了
QString strTempName = strDir + strDatabaseName;
db = QSqlDatabase::addDatabase("QSQLITE", m_strDatabaseName);
db.setDatabaseName(strTempName);
}
if (!db.open())
qDebug() << db.lastError().text();
return db;
}
2.關(guān)閉數(shù)據(jù)庫(kù)
比較簡(jiǎn)單,直接移除數(shù)據(jù)名就可以了
bool SqlLiteObject::closeDatabase()
{
QSqlDatabase::removeDatabase(m_strDatabaseName);
return true;
}
3.創(chuàng)建數(shù)據(jù)庫(kù)表
使用數(shù)據(jù)表名strTableName以及列名strHeaderNameList來(lái)對(duì)外創(chuàng)建
bool SqlLiteObject::createTable(QString strTableName, QStringList strHeaderNameList)
{
bool bRet = true;
do
{
// 必須存在表名和列表名
if (strTableName.isEmpty() || strHeaderNameList.size() <= 0)
{
bRet = false;
return bRet;
}
// m_strTableNameHeaderHash,這是一個(gè)QHash
auto findItem = m_strTableNameHeaderHash.find(strTableName);
if (findItem == m_strTableNameHeaderHash.end())
m_strTableNameHeaderHash.insert(strTableName, strHeaderNameList);
// 開(kāi)始組成一個(gè)創(chuàng)建表的sql語(yǔ)句
QString strCreateTable = QString(u8"CREATE TABLE %1(").arg(strTableName);
for (int i = 0; i < strHeaderNameList.size(); i++)
{
if (i < (strHeaderNameList.size() - 1))
strCreateTable = strCreateTable + strHeaderNameList[i] + QString(" VARCHAR(256)") + QString(",");
else
strCreateTable = strCreateTable + strHeaderNameList[i] + QString(" VARCHAR(256)") + QString(")");
}
bRet = excute(strCreateTable);
} while (0);
// 這里同時(shí)也創(chuàng)建一個(gè)csv文件,用了本地直接打開(kāi)
do
{
QString strDir = QString("%1/%2/%3").arg("C:/").arg("log").arg(SAVE_DIR_NAME);
QDir dirCSV;
if (!dirCSV.exists(strDir))
dirCSV.mkpath(strDir);
QString strFilePath = strDir + "/" + QString("%1-%2.csv").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd")).arg(strTableName);
static QMutex mutex;
QFile fileCSV;
if (!fileCSV.exists(strFilePath))
{
mutex.lock();
QFile file(strFilePath);
if (file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
{
QTextStream in(&file);
QString strText("");
for (int i = 0; i < strHeaderNameList.size(); i++)
{
if (i == 0)
strText = strHeaderNameList[i] + ",";
else if (i < (strHeaderNameList.size() - 1))
strText = strText + strHeaderNameList[i] + ",";
else
strText = strText + strHeaderNameList[i];
}
in << strText << '\n';
file.close();
}
mutex.unlock();
}
} while (0);
return bRet;
}
4.刪除表
直接執(zhí)行刪除數(shù)據(jù)表語(yǔ)句
bool SqlLiteObject::dropTable(QString strTableName)
{
if (strTableName.isEmpty())
return false;
QString strDrop = QString("DROP TABLE %1").arg(strTableName);
return excute(strDrop);
}
5.執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句
為了解決線程的問(wèn)題,我們這里采用的是打開(kāi)數(shù)據(jù)庫(kù)后再去執(zhí)行數(shù)據(jù)庫(kù)語(yǔ)句。
bool SqlLiteObject::excute(QString strSql)
{
bool bRet = true;
QSqlDatabase db = openDatabase(m_strDatabaseName);
QString strConnectionName = db.connectionName();
QSqlQuery query(db);
query.prepare(strSql);
bool success = query.exec(strSql);
if (!success)
{
qDebug() << "Error:" << query.lastError();
bRet = false;
}
closeDatabase();
return bRet;
}
6.數(shù)據(jù)庫(kù)查詢(xún)
我們直接將查詢(xún)后的數(shù)據(jù)直接緩存到一個(gè)哈希表里面,這樣我們應(yīng)用層要使用的時(shí)候,再?gòu)墓1砝锩娅@取。
QList< QHash
{
QList< QHash
if (strTableName.isEmpty() || strTableName.isEmpty())
return temp;
QSqlDatabase db = openDatabase(m_strDatabaseName);
QString strConnectionName = db.connectionName();
QString strSelect("");
if (!strValue.isEmpty())
strSelect = QString("SELECT * FROM %1 WHERE %2 = '%3';").arg(strTableName).arg(strName).arg(strValue);
else
strSelect = QString("SELECT * FROM %1;").arg(strTableName);
db.transaction(); // 開(kāi)啟事務(wù)查詢(xún)
QSqlQuery query("", db);
query.exec(strSelect);
db.commit(); // 提交事務(wù)
while (query.next())
{
QHash
int nCount = query.record().count();
for (size_t i = 0; i < nCount; i++)
keyValueHash.insert(query.record().fieldName(i), query.record().value(i).toString());
if (keyValueHash.size() > 0)
temp << keyValueHash;
}
closeDatabase();
return temp;
}
7.數(shù)據(jù)庫(kù)插入
插入數(shù)據(jù)庫(kù)的同時(shí),也保存到本地csv文件,方便用文本直接打開(kāi)查看內(nèi)容。
bool SqlLiteObject::insert(QString strTableName, QHash
{
bool bRet = false;
if (strTableName.isEmpty())
return bRet;
QStringList strHeaderList;
auto findItem = m_strTableNameHeaderHash.find(strTableName);
if (findItem == m_strTableNameHeaderHash.end())
return bRet;
else
strHeaderList = m_strTableNameHeaderHash[strTableName];
// 緩存到csv文件里面
do
{
QString strDir = QString("%1/%2").arg("C:/").arg("Database");
QString strFilePath = strDir + "/" + QString("%1-%2.csv").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd")).arg(strTableName);
static QMutex mutex;
mutex.lock();
QFile file(strFilePath);
if (file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text))
{
QTextStream in(&file);
QString strMessage;
for (size_t j = 0; j < strHeaderList.size(); j++)
{
QString strName = strHeaderList[j];
QString strValue = "";
auto findName = dataHash.find(strName);
if (findName != dataHash.end())
strValue = findName.value();
if (j == 0)
strMessage = strValue + ",";
else if (j < (strHeaderList.size() - 1))
strMessage = strMessage + strValue + ",";
else
strMessage = strMessage + strValue;
}
in << strMessage << '\n';
file.close();
}
mutex.unlock();
} while (0);
// 插入數(shù)據(jù)庫(kù)
do
{
QString strInsert = QString("INSERT INTO %1 VALUES(").arg(strTableName);
for (size_t j = 0; j < strHeaderList.size(); j++)
{
QString strName = strHeaderList[j];
QString strValue = "";
auto findName = dataHash.find(strName);
if (findName != dataHash.end())
strValue = findName.value();
if (j < (strHeaderList.size() - 1))
strInsert = strInsert + QString("'%1'").arg(strValue) + QString(",");
else
strInsert = strInsert + QString("'%1'").arg(strValue) + QString(")");
}
bRet = excute(strInsert);
} while (0);
return bRet;
}
8.模糊查詢(xún)
有時(shí)候我們界面需要一些自動(dòng)補(bǔ)全的功能,那么這個(gè)時(shí)候,模糊查詢(xún)就是我們要用的方式。
QStringList SqlLiteObject::fuzzySearch(QString strTableName, QString strName, QString strLike)
{
QStringList temp;
if (strTableName.isEmpty() || strTableName.isEmpty())
return temp;
QSqlDatabase db = openDatabase(m_strDatabaseName);
QString strConnectionName = db.connectionName();
QString strSelect("");
if (!strLike.isEmpty())
strSelect = QString("SELECT %1 FROM %2 WHERE %3 LIKE '%%4%' LIMIT 0,10;").arg(strName).arg(strTableName).arg(strName).arg(strLike);
else
return temp;
db.transaction(); // 開(kāi)啟事務(wù)查詢(xún)
QSqlQuery query("", db);
query.exec(strSelect);
while (query.next())
{
QHash
for (size_t i = 0; i < query.record().count(); i++)
{
QString strName = query.record().fieldName(i);
QString strValue = query.record().value(i).toString();
if (!temp.contains(strValue) && (strLike != strValue))
temp << strValue;
}
}
db.commit(); // 提交事務(wù)
closeDatabase();
return temp;
}
柚子快報(bào)激活碼778899分享:QT-Sqlite數(shù)據(jù)庫(kù)的使用
參考文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。