SQLite是一個(gè)開源的嵌入式數(shù)據(jù)庫(kù),其特點(diǎn)是零配置,可移植性好,小巧、高效而且可靠。同時(shí)SQLite的數(shù)據(jù)庫(kù)權(quán)限只依賴于文件系統(tǒng),沒有用戶帳戶的概念,因此使用起來很方便。英創(chuàng)Linux主板能夠很好的支持SQLite,相關(guān)的測(cè)試?yán)桃呀?jīng)在光盤中提供,本文主要簡(jiǎn)介Qt中的數(shù)據(jù)庫(kù)開發(fā)。
Qt中的QtSql模塊提供了對(duì)數(shù)據(jù)庫(kù)的支持,該模塊中的眾多類基本上可以分為三層:用戶接口層、SQL接口層,驅(qū)動(dòng)層。
其中驅(qū)動(dòng)層為具體的數(shù)據(jù)庫(kù)和SQL接口層之間提供了底層的橋梁;SQL接口層提供了對(duì)數(shù)據(jù)庫(kù)的訪問;用戶接口層的幾個(gè)類實(shí)現(xiàn)了將數(shù)據(jù)庫(kù)中的數(shù)據(jù)鏈接到窗口部件上,這些類是使用前一章的模型/視圖框架實(shí)現(xiàn)的,它們是更高層次的抽象,即便不熟悉SQL也可以操作數(shù)據(jù)庫(kù)。如果要使用QtQql模塊中的這些類,需要在項(xiàng)目文件(.pro文件)中添加QT += sql這一行代碼。
QtSql模塊使用數(shù)據(jù)庫(kù)驅(qū)動(dòng)來和不同的數(shù)據(jù)庫(kù)接口進(jìn)行通信。由于Qt的SQL模型的接口是獨(dú)立于數(shù)據(jù)庫(kù)的,所以所有數(shù)據(jù)庫(kù)特定的代碼都包含在了這些驅(qū)動(dòng)中。我們使用的免費(fèi)的Qt只提供了SQLite和ODBC數(shù)據(jù)庫(kù)的驅(qū)動(dòng)。創(chuàng)建數(shù)據(jù)庫(kù)連接:
QSqlDatabase db = QSqlDatabase::addDatabase('QSQLITE'); //指定驅(qū)動(dòng)
db.setDatabaseName('/mnt/nandflash/my.db'); //指定路徑
使用open()函數(shù)將數(shù)據(jù)庫(kù)打開,如果打開失敗,則彈出對(duì)話提示框:
if (!db.open())
{
QMessageBox::critical(0, qApp->tr('Cannot open database'),
qApp->tr('Unable to establisha database connection.'
), QMessageBox::Cancel);
return false;
}
使用QSqlQuery創(chuàng)建了一個(gè)product表,并插入id,name和speed三個(gè)字段的三條記錄。其中,id字段是int類型的,''primary key ''表明該字段是主鍵,它不能為空,而且不能有重復(fù)的值;而name字段是varchar類型的,Speed字段也是varchar類型的,注意這里使用的SQL語句都要包含在雙引號(hào)中,如果一行寫不完,那么分行后,每一行都要使用兩個(gè)雙引號(hào)引起來:
QSqlQuery query;
// 創(chuàng)建product表
query.exec(QString ('create table product (id int primary key, '
'name varchar, Speed varchar)'));
query.exec(QString ('insert into product values(1, 'EM335x', '1GHZ')'));
query.exec(QString ('insert into product values(2, 'EM3352', '600MHZ')'));
query.exec(QString ('insert intoproduct values(3, 'EM9280', '454MHZ')'));
SQL表格模型提供了一個(gè)一次只能操作一個(gè)SQL表的讀/寫模型QSqlTableModel,它可以瀏覽和修改獨(dú)立的SQL表,并且只需編寫很少的代碼,而且不需要了解SQL語法。該模型默認(rèn)是可讀可寫的。我們首先創(chuàng)建一個(gè)QSqlTableModel,只須使用setTable()來為其指定數(shù)據(jù)庫(kù)表,然后使用select()函數(shù)進(jìn)行查詢:
model = new QSqlTableModel(this);
model->setTable('product');
model->select();
// 設(shè)置編輯策略
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
ui->tableView->setModel(model);
在使用該模型前,一般還要設(shè)置其編輯策略,它由QsqlTableModel::EditStrategy枚舉變量定義,一共有三個(gè)值:
QsqlTableModel::OnFieldChange:所有對(duì)模型的改變都會(huì)立即應(yīng)用到數(shù)據(jù)庫(kù)。
QsqlTableModel::OnRowChange:對(duì)一條記錄的改變會(huì)在用戶選擇另一條記錄時(shí)被應(yīng)用。
QsqlTableModel::OnManualSubmit:所有的改變都會(huì)在模型中進(jìn)行緩存,知道調(diào)用submitAll()或者revertAll()函數(shù)。
下面添加一些功能按鈕,逐個(gè)實(shí)現(xiàn)他們:
// 提交修改按鈕
void MainWindow::on_pushButton_clicked()
{
// 開始事務(wù)操作
model->database().transaction();
if (model->submitAll()) {
model->database().commit(); //提交
} else {
model->database().rollback(); //回滾
QMessageBox::warning(this, tr('tableModel'),
tr('數(shù)據(jù)庫(kù)錯(cuò)誤: %1').arg(model->lastError().text()));
}
}
如果可以使用submitAll()將模型中的修改向數(shù)據(jù)庫(kù)提交成功,那么執(zhí)行commit(),否則進(jìn)行回滾rollback(),并提示錯(cuò)誤信息,下面是撤銷修改按鈕:
// 撤銷修改按鈕
void MainWindow::on_pushButton_2_clicked()
{
model->revertAll();
}
這里使用了setFilter()函數(shù)來進(jìn)行數(shù)據(jù)篩選,采用id來篩選:
// 查詢按鈕,進(jìn)行篩選
void MainWindow::on_pushButton_7_clicked()
{
QString id = ui->comboBox->currentText();
//根據(jù)id進(jìn)行篩選,一定要使用單引號(hào)
model->setFilter(QString('id = '%1'').arg(id));
model->select();
}
使用setTable()來指定數(shù)據(jù)庫(kù)表,然后使用select()函數(shù)進(jìn)行查詢:
// 顯示全表按鈕
void MainWindow::on_pushButton_8_clicked()
{
model->setTable('product');
model->select();
}
// 按id升序排列按鈕
void MainWindow::on_pushButton_5_clicked()
{
//id屬性,即第0列,升序排列
model->setSort(0, Qt::AscendingOrder);
model->select();
}
// 按id降序排列按鈕
void MainWindow::on_pushButton_6_clicked()
{
model->setSort(0, Qt::DescendingOrder);
model->select();
}
// 刪除選中行按鈕
void MainWindow::on_pushButton_4_clicked()
{
// 獲取選中的行
int curRow = ui->tableView->currentIndex().row();
// 刪除該行
model->removeRow(curRow);
int ok = QMessageBox::warning(this,tr('刪除當(dāng)前行!'),
tr('你確定刪除當(dāng)前行嗎?'), QMessageBox::No,QMessageBox::Yes);
if(ok == QMessageBox::No)
{ // 如果不刪除,則撤銷
model->revertAll();
} else { // 否則提交,在數(shù)據(jù)庫(kù)中刪除該行
model->submitAll();
}
}
// 添加記錄按鈕
void MainWindow::on_pushButton_3_clicked()
{
// 獲得表的行數(shù)
int rowNum = model->rowCount();
int id = rowNum + 1 ;
// 添加一行
model->insertRow(rowNum);
model->setData(model->index(rowNum,0), id);
// 可以直接提交
//model->submitAll();
}
運(yùn)行效果:
-
Linux
+關(guān)注
關(guān)注
87文章
11465瀏覽量
212817 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6097瀏覽量
36140
發(fā)布評(píng)論請(qǐng)先 登錄
信創(chuàng)浪潮下,國(guó)產(chǎn)主板有什么新的發(fā)展機(jī)遇?

Linux的作用
適用于SQLite的dbExpress數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序
從Delphi、C++ Builder和Lazarus連接到MySQL數(shù)據(jù)庫(kù)

適用于MySQL和MariaDB的Python連接器:可靠的MySQL數(shù)據(jù)連接器和數(shù)據(jù)庫(kù)

從Delphi、C++ Builder和Lazarus連接到Oracle數(shù)據(jù)庫(kù)
基于QT開發(fā)國(guó)產(chǎn)主板終端桌面程序 高效、穩(wěn)定、跨平臺(tái)的解決方案
云數(shù)據(jù)庫(kù)是哪種數(shù)據(jù)庫(kù)類型?
數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—Mysql數(shù)據(jù)庫(kù)表記錄丟失的數(shù)據(jù)恢復(fù)流程

數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—通過拼接數(shù)據(jù)庫(kù)碎片恢復(fù)SQLserver數(shù)據(jù)庫(kù)

有云服務(wù)器還需要租用數(shù)據(jù)庫(kù)嗎?
數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)—SQL Server數(shù)據(jù)庫(kù)出現(xiàn)823錯(cuò)誤的數(shù)據(jù)恢復(fù)案例

基于WDS證券行業(yè)建設(shè)金融信創(chuàng)云承載數(shù)據(jù)庫(kù)類關(guān)鍵應(yīng)用

基于分布式存儲(chǔ)WDS的金融信創(chuàng)云承載數(shù)據(jù)庫(kù)類關(guān)鍵應(yīng)用

評(píng)論