1. 程式人生 > >第一個qt+sqlite3程式

第一個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 '預設’專案中更