一、項(xiàng)目介紹
當(dāng)前文章介紹的設(shè)計(jì)的主要功能是利用 SQLite 數(shù)據(jù)庫(kù)實(shí)現(xiàn)寵物投喂器上傳數(shù)據(jù)的存儲(chǔ),并且支持?jǐn)?shù)據(jù)的增刪改查操作。其中,寵物投喂器上傳的數(shù)據(jù)包括投喂間隔時(shí)間、水溫、剩余重量等參數(shù)。
實(shí)現(xiàn)功能:
- 創(chuàng)建 SQLite 數(shù)據(jù)庫(kù)表,用于存儲(chǔ)寵物投喂器上傳的數(shù)據(jù)。
- 實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表中數(shù)據(jù)的插入操作,即將從寵物投喂器接收到的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中。
- 實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表中數(shù)據(jù)的查詢操作,包括按照投喂間隔時(shí)間、水溫、剩余重量等參數(shù)進(jìn)行篩選,以便用戶能夠查看特定范圍內(nèi)的數(shù)據(jù)信息。
- 實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表中數(shù)據(jù)的修改操作,即可以修改已經(jīng)存儲(chǔ)的寵物投喂器上傳的數(shù)據(jù)。
- 實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表中數(shù)據(jù)的刪除操作,即可以刪除已經(jīng)存儲(chǔ)的寵物投喂器上傳的數(shù)據(jù)。
二、SQLite數(shù)據(jù)庫(kù)
SQLite是一款輕量級(jí)、開(kāi)源的嵌入式關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),設(shè)計(jì)目標(biāo)是嵌入式設(shè)備或應(yīng)用程序使用。與傳統(tǒng)的客戶端/服務(wù)器模式不同,SQLite引擎不是一個(gè)獨(dú)立的進(jìn)程,而是被集成在一個(gè)應(yīng)用程序中。應(yīng)用程序可以訪問(wèn)SQLite數(shù)據(jù)庫(kù)文件,讀寫(xiě)其中的數(shù)據(jù),從而實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和管理。
以下是 SQLite 數(shù)據(jù)庫(kù)的特點(diǎn):
- 輕量級(jí):SQLite 占用資源較小,運(yùn)行速度快,并且可以很方便地集成到應(yīng)用程序中,使其成為一個(gè)內(nèi)嵌的數(shù)據(jù)庫(kù)。
- 無(wú)需服務(wù)器:SQLite 是一款本地化的數(shù)據(jù)庫(kù),無(wú)需專門的服務(wù)器進(jìn)行支持,因此對(duì)于小型應(yīng)用程序來(lái)說(shuō),是一種非常適合的解決方案。
- 開(kāi)源:SQLite 是一款開(kāi)源的數(shù)據(jù)庫(kù),用戶可以免費(fèi)獲取其源代碼,并且可以自由地進(jìn)行修改和定制。
- 支持 SQL:SQLite 支持完整的 SQL 標(biāo)準(zhǔn),并且在 SQL 語(yǔ)法和命令方面與其他關(guān)系型數(shù)據(jù)庫(kù)非常接近,具有較高的兼容性。
- 可移植性:SQLite 支持多種操作系統(tǒng)和編程語(yǔ)言,如 Windows、Linux、Mac OS X、iOS、Android 等平臺(tái),以及 C/C++、Java、Python、C# 等編程語(yǔ)言。
- 數(shù)據(jù)庫(kù)存儲(chǔ)方式: SQLite 將數(shù)據(jù)庫(kù)存儲(chǔ)在單個(gè)文件中,用戶可以根據(jù)需要將其復(fù)制或移動(dòng)到其他位置或計(jì)算機(jī)中,以方便數(shù)據(jù)的安全備份和分享。
三、在Qt里使用SQLITE數(shù)據(jù)庫(kù)
在 Qt 中,使用 SQLite 數(shù)據(jù)庫(kù)的主要流程如下:
(1)導(dǎo)入 SQLite 相關(guān)庫(kù)文件:在 Qt 項(xiàng)目中,需要先導(dǎo)入 SQLite 相關(guān)的庫(kù)文件和頭文件,以便在代碼中使用 SQLite 的相關(guān)函數(shù)和類。
需要在項(xiàng)目文件中添加以下語(yǔ)句:
QT += sql
這樣就可以包含 SQLite 數(shù)據(jù)庫(kù)支持的相關(guān)頭文件和類。
(2)創(chuàng)建數(shù)據(jù)庫(kù)連接:使用 QSqlDatabase 類可以在 Qt 中創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接。需要設(shè)置數(shù)據(jù)庫(kù)類型(如 "QSQLITE"),以及數(shù)據(jù)庫(kù)文件路徑等參數(shù)。
代碼示例如下:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mydatabase.db");
在實(shí)際使用時(shí),可以使用絕對(duì)或相對(duì)路徑指定數(shù)據(jù)庫(kù)文件路徑。
(3)打開(kāi)數(shù)據(jù)庫(kù):使用 QSqlDatabase 類的 open 函數(shù)可以打開(kāi)數(shù)據(jù)庫(kù)連接。在成功打開(kāi)數(shù)據(jù)庫(kù)后,可以執(zhí)行 SQL 查詢語(yǔ)句,讀取和修改數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
代碼示例:
if(db.open())
{
QSqlQuery query;
query.exec("CREATE TABLE mytable (id INTEGER PRIMARY KEY, name TEXT)");
query.exec("INSERT INTO mytable VALUES(1, 'John')");
query.exec("SELECT id, name FROM mytable");
while(query.next()) {
int id = query.value(0).toInt();
QString name = query.value(1).toString();
qDebug() < < id < < name;
}
}
以上代碼創(chuàng)建了一個(gè)名為 "mytable" 的數(shù)據(jù)庫(kù)表,并向其中插入了一條記錄。隨后,執(zhí)行 SELECT 查詢語(yǔ)句讀取表中的數(shù)據(jù),并將結(jié)果輸出到控制臺(tái)中。
(4)關(guān)閉數(shù)據(jù)庫(kù):當(dāng)不再需要使用數(shù)據(jù)庫(kù)時(shí),應(yīng)該使用 close 函數(shù)關(guān)閉數(shù)據(jù)庫(kù)連接,以釋放資源。
代碼示例:
db.close();
在以上流程中,使用 QSqlQuery 類可以執(zhí)行 SQL 查詢語(yǔ)句,并獲取查詢結(jié)果。通過(guò) QSqlRecord 類可以訪問(wèn)查詢結(jié)果中的字段和值。
四、完整代碼
下面是 Qt(C++)中利用 SQLite 數(shù)據(jù)庫(kù)對(duì)寵物投喂器上傳的數(shù)據(jù)進(jìn)行存儲(chǔ)管理的實(shí)現(xiàn)代碼,包括數(shù)據(jù)的增刪改查功能:
#include < QtSql >
#include < QDebug >
?
// 創(chuàng)建或打開(kāi)數(shù)據(jù)庫(kù)連接
bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("petfeeder.db");
if (!db.open()) {
qDebug() < < "Failed to connect database.";
return false;
}
// 創(chuàng)建 petfeeder 表
QSqlQuery query;
bool ret = query.exec("CREATE TABLE IF NOT EXISTS petfeeder "
"(id INTEGER PRIMARY KEY AUTOINCREMENT, "
"interval INTEGER, temperature REAL, weight REAL)");
if (!ret) {
qDebug() < < "Failed to create table: " < < query.lastError().text();
}
return true;
}
?
// 插入數(shù)據(jù)
void insertData(int interval, double temperature, double weight)
{
QSqlQuery query;
QString sql = QString("INSERT INTO petfeeder (interval, temperature, weight) "
"VALUES (%1, %2, %3)").arg(interval).arg(temperature).arg(weight);
bool ret = query.exec(sql);
if (!ret) {
qDebug() < < "Failed to insert data: " < < query.lastError().text();
}
}
?
// 更新數(shù)據(jù)
void updateData(int id, int interval, double temperature, double weight)
{
QSqlQuery query;
QString sql = QString("UPDATE petfeeder SET interval=%1, temperature=%2, weight=%3 "
"WHERE id=%4").arg(interval).arg(temperature).arg(weight).arg(id);
bool ret = query.exec(sql);
if (!ret) {
qDebug() < < "Failed to update data: " < < query.lastError().text();
}
}
?
// 刪除數(shù)據(jù)
void deleteData(int id)
{
QSqlQuery query;
QString sql = QString("DELETE FROM petfeeder WHERE id=%1").arg(id);
bool ret = query.exec(sql);
if (!ret) {
qDebug() < < "Failed to delete data: " < < query.lastError().text();
}
}
?
// 查詢數(shù)據(jù)
void queryData()
{
QSqlQuery query("SELECT * FROM petfeeder");
while (query.next()) {
int id = query.value(0).toInt();
int interval = query.value(1).toInt();
double temperature = query.value(2).toDouble();
double weight = query.value(3).toDouble();
qDebug() < < "Id:" < < id < < "Interval:"