第一個qt+sqlite3程式
目前想學習下sqlite資料庫程式設計。之前在開發板上執行Qt程式時,出現了只能讀資料庫,不能進行寫入的情況。在網上查得可以不使用Qt自帶的資料庫,重新編譯一個sqlite3庫,然後在Qt中使用這個庫就可以了。為了使學習的更為全面,報著認真敲程式碼的態度,我將這個學習過程以部落格的形式寫出來。對程式中可能出現的問題,儘量不留死角。同時,在後面儘量解決以前遇到的問題。
現在開發工具如下:
smart210開發板,linux3.0.8核心,qt4.8.6程式庫,虛擬機器ubuntu12.04系統,交叉編譯器arm-linux-gcc 4.5.1。
首先是配置下環境,qte庫在友善之臂中的光碟中已經給出,這裡我簡單說一下sqlite3的編譯。首先進入原始碼目錄,執行 “./configure --help > help.txt” 命令,將幫助資訊列印到help.txt檔案中,開啟這個檔案,可看到如下說明:
Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [/usr/local] System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> LIBS libraries to pass to the linker, e.g. -l<library> CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> CPP C preprocessor
這裡設定prefix(安裝目錄)、host(目標平臺)、CC(編譯器)這三個引數即可。命令 “./configure --prefix=/usr/local/arm_sqlite --host=arm-linux CC=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc” 。然後 make,make install。
下面開始第一個qt+sqlite3工程。
首先建立一個Qt Widgets Application 工程,這裡命名為1_sqlite3。在工程檔案1_sqlite3.pro中新增下面兩行程式碼,來指定sqlite3的庫與標頭檔案位置。
LIBS += -L/usr/local/arm_sqlite/lib -lsqlite3
INCLUDEPATH += /usr/local/arm_sqlite/include
接下來建立ui介面如下。
這裡工程要實現sqlite3的基本功能,如:建立一個表格、刪除一個表格、插入一行資料、刪除一行資料、查詢一條資料並顯示。
首先看資料庫的開啟,程式碼如下。
//連線資料庫
int ret = sqlite3_open("./test.db", &db);
if (ret != SQLITE_OK)
{
fprintf(stderr, "Cannot open datebase %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
this->close();
}
printf("Connect success\n");
sqlite3_open()函式會開啟一個數據庫檔案,當這個檔案不存在則建立。下面是建立一個表格的程式碼。
void MainWindow::on_pushButton_ct_clicked()
{
const char *sSQL = "create table users ("
"id integer PRIMARY KEY AUTOINCREMENT, "
"name varchar(40) NOT NULL, "
"age integer NOT NULL, "
"birthday datetime NOT NULL, "
"email varchar(40) NOT NULL);";
//執行建表SQL
int ret = sqlite3_exec(db, sSQL, NULL, 0, &pErrMsg);
if (ret != SQLITE_OK)
{
fprintf(stderr, "SQL create error: %s\n", pErrMsg);
sqlite3_free(pErrMsg); //be supposed
return;
}
rows = 0;
index = 0;
printf("Datebase table creator success!!\n");
}
使用sqlite3_exec()函式可以執行一條資料庫指令,函式有5個引數,第一個是開啟的資料庫索引,第二個是要執行的語句,第三個是回撥函式,當成功執行資料庫語句後就會呼叫這個函式,第四個是傳遞給回撥函式的引數,第五個是用來儲存錯誤資訊。這裡建立了一個users表格,其有5列資料,第一列為id,設為主鍵。建立表格成功後,將表格的行數rows,當前查詢的行號置零。接下來是插入一行資料的指令,程式碼如下。
void MainWindow::on_pushButton_ic_clicked()
{
rows++;
QByteArray qb = QString("insert into users values"
"(%1, 'ws_%2', %3, '1989-5-4', '[email protected]');")
.arg(rows).arg(rows).arg(20+rows).toLatin1();
const char *sSQL = qb.data();
//執行插入資料
int ret = sqlite3_exec(db, sSQL, NULL, 0, &pErrMsg);
if (ret != SQLITE_OK)
{
fprintf(stderr, "SQL insert error: %s\n", pErrMsg);
sqlite3_free(pErrMsg); //be supposed
return;
}
ui->horizontalSlider->setMaximum(rows);
printf("Datebase insert success!\n");
}
這裡,將id號賦值為行號,姓名為"ws_行號",年齡為"20+行號",然後剩下兩個引數固定,由於建立表格與插入資料都不需要呼叫回撥函式,所以這裡sqlite3_exec() 函式的第三個和第四個引數分別設定為NULL和零。接下來是查詢語句,程式碼如下。
void MainWindow::on_pushButton_sp_clicked()
{
if(index == 0) index = 1;
if(index > 1) index--;
QByteArray qb = QString("select * from users where id=%1").arg(index).toLatin1();
const char *sSQL = qb.data();
//執行查詢操作
int ret = sqlite3_exec(db, sSQL, _sql_callback, ui, &pErrMsg);
if (ret != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", pErrMsg);
sqlite3_free(pErrMsg);
return;
}
ui->horizontalSlider->setValue(index);
printf("Datebase inquire success!!\n");
}
這裡將id號作為查詢條件,執行了資料庫的查詢操作,查詢的結果可以通過回撥函式來讀出,如果查詢的為多行,則回撥函式會被多次順序呼叫。這裡的回撥函式為_sql_callback(),其中傳遞給回撥函式的指標為ui指標。下面看回調函式的定義。
int MainWindow::_sql_callback(void *p, int argc, char **argv, char **szColName)
{
Ui::MainWindow *ui = (Ui::MainWindow*)p;
printf("Select argc:%d\n", argc);
ui->textEdit->clear();
for (int i = 0; i < argc; i++)
{
ui->textEdit->append(QString("Property :%1, Value :%2").arg(szColName[i]).arg(argv[i]));
}
return 0;
}
回撥函式的引數中,p指標為傳入的引數,即上面傳入的ui指標,使用時要先將其強制轉換。argc引數表示查詢的一行資料有多少項,szColName指向該項資料的屬性名,argv指向該項資料的值。這裡將其顯示到ui介面的textEdit控制元件上。下面來看刪除行的操作,程式碼如下。
void MainWindow::on_pushButton_dc_clicked()
{
if(rows > 0) rows--;
else{
printf("No more row..\n");
return;
}
QByteArray qb = QString("delete from users where id=%1").arg(rows).toLatin1();
const char *sSQL = qb.data();
//delete row
int ret = sqlite3_exec(db, sSQL, NULL, 0, &pErrMsg);
if (ret != SQLITE_OK)
{
fprintf(stderr, "SQL insert error: %s\n", pErrMsg);
sqlite3_free(pErrMsg); //be supposed
return;
}
ui->horizontalSlider->setMaximum(rows);
printf("Datebase insert success!\n");
}
刪除行時,呼叫的命令為"delete from users where id=n",刪除一行後,應將行數減一,這裡行數是通過ui控制元件的horizontalSlider 來表示的。接下來是刪除表格的命令,程式碼如下。
void MainWindow::on_pushButton_dt_clicked()
{
const char *sSQL = "drop table users";
//delete table
int ret = sqlite3_exec(db, sSQL, NULL, 0, &pErrMsg);
if (ret != SQLITE_OK)
{
fprintf(stderr, "SQL delete error: %s\n", pErrMsg);
sqlite3_free(pErrMsg); //be supposed
return;
}
rows = 0;
index = 0;
printf("Datebase table delete success!!\n");
}
刪除表格的命令比較簡單,為“drop table 表名”。最後來張在開發板上執行的圖片。
執行時,會通過串列埠列印命令執行的狀態。如果啟動應用時,表格已經存在,這個時候,為了是“查詢下一條”這個按鈕可以執行往下查詢資料的命令,應該將表格的最大行數讀出來,作為查詢的參考條件。查詢表格行數的命令是“select count(*) from 表名”,下面是查詢表格最大行數的程式碼。
int MainWindow::sql_getrows(QString table)
{
sqlite3_stmt *stat;
QByteArray qb = QString("select count(*) from %1").arg(table).toLatin1();
const char *sSQL = qb.data();
int ret = sqlite3_prepare_v2(db, sSQL, -1, &stat, 0);
if (ret != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", "prepare_v2");
return 0;
}
int count=0;
if(sqlite3_step(stat)==SQLITE_ROW)
{
count=sqlite3_column_int(stat, 0);
}
sqlite3_finalize(stat); //perpare will lock the db, this unlock the db
return count;
}
整個工程檔案可以在http://download.csdn.net/detail/westlor/9395502下載。
相關推薦
第一個qt+sqlite3程式
目前想學習下sqlite資料庫程式設計。之前在開發板上執行Qt程式時,出現了只能讀資料庫,不能進行寫入的情況。在網上查得可以不使用Qt自帶的資料庫,重新編譯一個sqlite3庫,然後在Qt中使用這個庫就可以了。為了使學習的更為全面,報著認真敲程式碼的態度,我將這個學
第一個Qt Quick程式(QML程式)
上一節我們詳細講述了Qt 4.7和Qt Creator 2.0的安裝。這一節,我們講述Qt Quick的應用。 Qt Quick是Qt 4.7主推的技術,下面是Qt官網對其進行的介紹: Qt Quick 是一種高階使用者介面技術,使用它可輕鬆地建立供移動和嵌入式裝置使用的動態
Ubuntu下建立第一個qt程式(非qt IDE)
使用QT5.9.1版本,自己建立qt源程式,經qmake編譯實現自己的第一個qt 程式。 /home/ttwang/Desktop目錄下建立一個資料夾qt-learing mkdir qt-learing 在/home/ttwang/Deskto
Qt creator第一個Qt5小程式:顯示帶背景顏色或圖片的QWidget的Hello World視窗
用“qt-opensource-linux-x64-5.3.0.run”版本,安裝步驟,該版本已經集成了QtCreator,在Tools目錄下: [email protected]:/opt/Qt5.3.0$ ls 5.3 components.xml Do
01 使用qt creator建立第一個pyqt5介面程式
1. 安裝Qt Creator 2. 利用Qt Creator建立介面 點選檔案 -> 新建檔案或專案 選擇Qt -> Qt設計師介面類 選擇一個模版,建立一個介面 之後一路下一步,進入主介面 將左面的控制元件
第一個python小程式——即時動態時鐘(程式碼解讀)
程式碼資源來自: http://n.miaopai.com/media/K9Qlou7rdPc5TxpPaL1VDvwfv5hP~lHK (執行有錯誤,缺少date,week和結尾部分) https://blog.csdn.net/yangxing2/article/details
《Python入門》第一個Python Web程式——簡單的Web伺服器
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Pycharm+Django搭建第一個Python Web程式
1.安裝django 無論是Python2.x還是Python3.x版本,都可以使用pip來安裝Django。在控制檯使用如下命令:pip install django 如: 2.檢查dgango是否安裝成功 安裝成功後,在ipython裡面或者Pycharm的Python console控制檯匯入d
C語言入門 2 安裝VS2013開發環境並編寫第一個C語言程式
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
第一個springMVC小程式
1.開發工具介紹 idea的安裝破解:https://www.cnblogs.com/jpfss/p/8872358.html jdk和Tomcat的配置都在裡面。 2.建立第一個小程式 2.1建立一個web專案 2.2建立大綱 2.3在web/WEB-IN
建立第一個Qt Quick Application
1、建立工程 2、 mainc.pp原始碼 #include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QGuiAppli
第一個hello ros程式
1 設定環境變數 在使用者許可權下輸入以下命令 每次啟動一個新的shell,且要在這個shell中執行ROS時,只要執行上述s
第一個js +html程式
<script type="text/javascript"> var result_1; var result_2; function get() { var a = getFirstNumber(); var b = getT
今天算是我的第一個10.24程式設計師節吧,記錄由VGG16復現過程中初見的用法、函式等,以此起步。
1.a[len(a):len(a)]=[] a=[] a[len(a):len(a)]=[]可以用來擴充套件list,類似append,但是append,又類似於”整體加入“ a=[8,9] print(a) a[len(a):len(a)]=[1,2,3] print(a,) a
Dubbo-第一個Hello World程式
Dubbo 是阿里巴巴在2011年開源的分散式服務框架,是SOA服務化治理方案的核心框架。Dubbo的整體架構如圖所示; Provider: 暴露服務的服務提供方。 Consumer: 呼叫遠端服務的服務消費方。 Registry: 服務註冊與發現的註冊中心。
JavaWeb 實現第一個Filter過濾器程式(教材學習筆記)
Filter被稱作過濾器,其基本功能就是對Servlet容器呼叫Servlet的過程進行攔截,從而實現一些特殊功能, Filter介面包含了三個方法 init()方法主要就是用來初始化過濾器,只會在web程式載入的時候呼叫一次 doFilter()方法是響應客戶端請求的,只要有請求就
第一個linux驅動程式,hello
前面已經把學習linux的開發環境搭建好了,現在逐步開始學習開發過程。先從核心驅動開始,寫一個網上已經被寫爛的實列程式。先把它編譯好,放進linux系統執行,看看是什麼樣子。 建立資料夾hello,在資料夾下面建立檔案hello.c程式碼如下: #include <linux/
Django-編寫你的第一個Django應用程式2
建立投票應用程式 您在Django中編寫的每個應用程式都包含遵循特定約定的Python包。 Django帶有一個實用程式,可以自動生成應用程式的基本目錄結構,因此您可以專注於編寫程式碼而不是建立目錄。 1、專案與應用程式 專案和應用程式有什麼區別? 應用程式是
Django-編寫你的第一個Django應用程式1
一、開發環境 MacOS10.13.1 python3.7 二、安裝 安裝命令: pip3 install django 檢視版本: python3 -m django --version 2.1.2 版本的選擇: 作為學習當然選擇最新版本了, 預設安裝的
Django-編寫你的第一個Django應用程式3
文章目錄 資料庫設定 開啟mysite/settings.py.這是一個普通的Python模組,其中的模組級變數代表Django設定。 預設情況下,配置使用SQLite。 如果您希望使用其他資料庫,請安裝相應的資料庫繫結,並在DATABASES '預設’專案中更