軟件設計開發筆記4:QT操作SQLite數據庫
??有時候我們需要在軟件中記錄一些歷史數據以便于對數據的查詢。而我們希望軟件不能太復雜,體量也不要太大,這個時候就需要如SQLite這樣輕量級的數據庫。這篇中我們就來討論如何在使用QT開發應用是操作SQLite數據庫。
0、概述
??SQLite是一款開源、輕量級、跨平臺的數據庫,無需Server,無需安裝和管理配置。它的設計目標是嵌入式的,所以很適合小型應用,也是Qt應用開發種常用的一種數據庫。
??我們先設計一個簡單的操作界面,最上面一行是六個操作按鈕,分別實現數據庫的連接、表格創建、數據查詢,插入數據、修改數據以及刪除數據。中間文紙是兩個輸入框,分別是輸入姓名和年齡。最下面是一個圖標顯示。具體形式如下:

??在開發之前,如果我們使用QtCreator則需要在*.pro中引入sql模塊(QT+=sql),如果是VS中在Qt VS Tool里勾選上sql模塊,就可以使用該模塊的接口了。
1、連接數據庫
??QSqlDatabase類提供了一個接口,用于通過連接訪問數據。SQLite在單個文件上運行,在打開連接時必須將其設置為數據庫名稱。如果該文件不存在,SQLite將嘗試創建它。
??我們實現一個連接數據庫的函數,并在“連接數據庫”按鈕的槽函數中調用它來實現數據庫的連接。具體的代碼如下:
void MainWindow::ConnectDatabase()
{
if(QSqlDatabase::contains("qt_sql_default_connection"))
{
db = QSqlDatabase::database("qt_sql_default_connection");\
}
else
{
db = QSqlDatabase::addDatabase("QSQLITE");
}
db.setDatabaseName("DBTest.db");
}
??在上述代碼中,我們連接一個名稱為“DBTest.db”的數據庫,但這個數據庫一開始是沒有的,所以運行這段代碼后會創建一個名為“DBTest.db”的數據庫。運行完成后我們使用SQLiteStudio查看,發現已經創建了一個名為“DBTest.db”的數據庫,并可一連接上。如下圖:

2、創建數據表
??接下來,我們創建一個數據表。其中QSqlQuery類可以使用SQL語句來實現與數據庫交互。所以在這里我們使用該類操作SQL語句穿件一個數據表。在這里我們創建一個名為staff的表格,該表中包括3個字段:id字段作為主鍵并自動增長;name字段和age字段用于存儲信息。具體代碼如下:
void MainWindow::CreateTable()
{
const QString sql="CREATE TABLE IF NOT EXISTS staff (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,name CHAR (50) UNIQUE NOT NULL,age INTEGER)";
//QSqlQuery構造前,需要db已打開并連接
//未指定db或者db無效時使用默認連接進行操作
QSqlQuery query;
if(query.exec(sql))
{
qDebug()<<"init table success";
}
else
{
//打印sql語句錯誤信息
qDebug()<<"init table error";
}
}
??運行完成創建表格命令后,我們使用SQLiteStudio查看數據的內容。連接數據庫可以看到staff表格以及包含的3個字段,說明創建成功,具體如下圖:

??關于QSqlQuery類,他是封裝在QSqlDatabase上,用以執行SQL查詢中創建,導航和檢索數據所涉及的功能。它可以被用來執行DML(數據操縱語言)語句,例如select、insert、update、delete,以及DDL(數據定義語言)語句,如create table。在后續的增、刪、改、查等操作中也是使用該類。
3、添加數據
??我們已經創建了表格,接下來我們嘗試向表格中添加數據。在這里我們使用QSqlQuery類中的prepare()方法來預設SQL語句,然后再通過bindValue()方法加入數據。具體實現代碼如下:
void MainWindow::InsertData()
{
QSqlQuery query;
query.prepare("INSERT INTO staff (name,age) VALUES (:name,:age)");
query.bindValue(":name", ui->lineEditName->text());
query.bindValue(":age", ui->lineEditAge->text());
query.exec();
}
??我們在操作界面中添加3條記錄,分別在姓名框和年齡框中輸入名字和年齡點擊“插入數據”按鈕實現對數據的插入。完成后顯示如下:

4、修改數據
??接下來我們嘗試對表中的數據進行修改。我們依然使用QSqlQuery類中的prepare()方法來預設SQL語句,然后再通過bindValue()方法加入數據。具體實現代碼如下:
void MainWindow::UpdateData()
{
QSqlQuery query;
query.prepare("UPDATE staff SET age=:age WHERE name=:name");
query.bindValue(":name",ui->lineEditName->text());//通過自定義的別名來替代
query.bindValue(":age",ui->lineEditAge->text());
query.exec();
}
??在這里我們嘗試將第條記錄修改一下,我們在姓名框中輸入“Rose”,在年齡框中輸入“31”,將Rose的年齡有28修改為31。輸入完成點擊“修改數據”按鈕,結果如下:

5、刪除數據
??接下來我們嘗試刪除數據。我們依然使用QSqlQuery類中的prepare()方法來預設SQL語句,然后再通過bindValue()方法加入數據。我們實現根據姓名來刪除數據,具體實現代碼如下:
void MainWindow::DeleteData()
{
QSqlQuery query;
query.prepare("DELETE FROM staff WHERE name=?");
query.addBindValue(ui->lineEditName->text());
query.exec();
}
??我們刪除第3條數據,我們在姓名框中輸入“Rose”,然后點擊“刪除數據”按鈕,得到結果如下:

6、查詢數據
??最后我們來實現數據的查詢問題。依然是使用QSqlQuery類,我們在這里使用查詢表格全部內容的方式。具體的實現代碼如下:
void MainWindow::QueryData()
{
ui->tableWidget->clear();
QStringList header;
header<<"id"<<"name"<<"age";
ui->tableWidget->setHorizontalHeaderLabels(header);
int i=0;
QSqlQuery query("SELECT * FROM staff");
while (query.next())
{
ui->tableWidget->setItem(i,0,new QTableWidgetItem(query.value(0).toString()));
ui->tableWidget->setItem(i,1,new QTableWidgetItem(query.value(1).toString()));
ui->tableWidget->setItem(i,2,new QTableWidgetItem(query.value(2).toString()));
i++;
}
}
??我們現在刪除后的表格中添加2條數據。分別是姓名“Rose”年齡“33”和姓名“Jake”年齡“45”兩條數據。然后重新連接數據庫并點擊“查詢數據”按鈕,得到如下結果:

??同時我們也可以使用SQLiteStudio直接產看數據庫的內容,具體如下:

??兩種方式查詢到的結果是一樣的,說明我們的操作是正確的。
7、小結
??在這一篇中我們嘗試了使用QT操作SQLite數據庫,增、刪、改、查以及創建等都可很好的實現。
歡迎關注:

如果閱讀這篇文章讓您略有所得,還請點擊下方的【好文要頂】按鈕。
當然,如果您想及時了解我的博客更新,不妨點擊下方的【關注我】按鈕。
如果您希望更方便且及時的閱讀相關文章,也可以掃描上方二維碼關注我的微信公眾號【木南創智】

浙公網安備 33010602011771號