• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Qt學習筆記之SQLITE數據庫

    標簽: Qt學習之路

    1. SQLite數據庫介紹

    SQLite,是一款輕型的數據庫,是遵守ACID的關系型數據庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域項目。它的設計目標是嵌入式的,而且已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統,同時能夠跟很多程序語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源的世界著名數據庫管理系統來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生于2000年5月。 至2019年已經有19個年頭,SQLite也迎來了一個版本 SQLite 3已經發布。

    Qt提供了一種進程內數據庫——SQLite,它小巧靈活,無須額外安裝配置且支持大部分ANSI SQL92標準,是一個輕量級的數據庫,概括起來它具有以下優點:

    (1)SQlite的設計目的是嵌入式SQL數據庫引擎,它基于純C語言代碼,應用非常廣泛。

    (2)SQlite在需要持久存儲時,可以直接讀寫硬盤上的數據文件,在無須持久存儲時,也可以將整個數據庫置于內存中,兩者均不需要額外的server服務端進程,即SQlite是無須獨立運行的數據庫引擎。

    (3)開放源代碼,整個代碼少于三萬行,有良好的注釋和90%以上的測試覆蓋率。

    (4)少于250K的內存占用(gcc編譯下)。

    (5)支持視圖、觸發器、事務,支持嵌套SQL功能。

    (6)提供虛擬機用于處理SQL語句。

    (7)不需要配置,不需要安裝,也不需要管理員。

    (8)支持大部分ANSI SQL92標準。

    (9)大部分應用的速度比目前常見的客戶端/服務器結構的數據庫快。

    (10)編程接口簡單易用。

    在持久存儲的情況下,一個完整的數據庫就對應磁盤上面的一個文件,它是一種具備了基本數據庫特性的數據文件,同一個數據文件可以在不同機器上面使用,可以在不同字節序的機器間自由共享,最大支持2TB數據容量,而且性能僅受限于系統的可用內存,沒有其他依賴,可以應用于多種操作系統平臺。

    SQLite可視化管理工具(SQLite Expert Pro)

    2. Qt操作SQLite數據庫

    2.1 創建一個數據庫

     QSqlDatabase類提供了一個接口,用于通過連接訪問數據。

        //! 添加數據庫驅動
        QSqlDatabase mySqlLiteDB = QSqlDatabase::addDatabase("QSQLITE");
        //! 設置數據庫名稱
        mySqlLiteDB.setDatabaseName("E:/work/qe/mytest1/database.db");
        //! 打開數據庫
        if(!mySqlLiteDB.open())
            return false;
    

    2.2 創建一個表

    QSqlQuery類可以使用SQL語句來實現與數據庫交互。

        //! 以下執行相關sql語句
        QSqlQuery mySqlQuery;
        //! 清空student表
        mySqlQuery.exec("drop table student");
        //! 新建student表,id設置為主鍵,還有一個name項
        mySqlQuery.exec("create table student (id int primary key, name vchar,course int)");

    主鍵:表中經常有一個列或多列的組合,其值能唯一地標識表中的每一行。這樣的一列或多列稱為表的主鍵,通過它可強制表的實體完整性。當創建或更改表時可通過定義 PRIMARY KEY 約束來創建主鍵。一個表只能有一個 PRIMARY KEY 約束,而且 PRIMARY KEY 約束中的列不能接受空值。由于 PRIMARY KEY 約束確保唯一數據,所以經常用來定義標識列

    作用:

    1)保證實體的完整性;

    2)加快數據庫的操作速度

    3) 在表中添加新記錄時,DBMS會自動檢查新記錄的主鍵值,不允許該值與其他記錄的主鍵值重復。

    4) DBMS自動按主鍵值的順序顯示表中的記錄。如果沒有定義主鍵,則按輸入記錄的順序顯示表中的記錄。

    2.3 插入數據 

    2.3.1 批量插入

    可以用prepare()來綁值,然后再通過bindValue()向綁值加入數據。

           //!批量導入
        QStringList strListStdName;
        strListStdName<<"wang bin"<<"xiao yu"<<"ye mei";
    
        QStringList strListStdCourse;
        strListStdCourse<<"Math"<<"English"<<"Computer";
    
        mySqlQuery.prepare("INSERT INTO student (id,name, course) "
                          "VALUES (:id,:name, :course)");
    
        for (int i = 0; i < strListStdName.size(); i++)
        {
            mySqlQuery.bindValue(":id",i);                         //! 加入主鍵
            mySqlQuery.bindValue(":name", strListStdName[i]);      //! 向綁定值里加入名字
            mySqlQuery.bindValue(":course", strListStdCourse[i]);  //! 課程
            mySqlQuery.exec();                                     //! 加入庫中
        }
        //! 向表中插入1條數據
        mySqlQuery.bindValue(0,3);
        mySqlQuery.bindValue(1,"wang han");
        mySqlQuery.bindValue(2,"Chinese");
        mySqlQuery.exec();

     這里在student表的最后又添加了一條記錄。然后我們先使用了prepare()函數,在其中利用了“:id”“:name”來代替具體的數據,而后又利用bindValue()函數給idname兩個屬性賦值,這稱為綁定操作。其中編號0和1分別代表“:id”“:name”,就是說按照prepare()函數中出現的屬性從左到右編號,最左邊是0 。

    特別注意,在最后一定要執行exec()函數,所做的操作才能被真正執行。運行程序,點擊查詢按鈕,可以看到前面添加的記錄的信息。這里的“:id”“:name”,叫做占位符,這是ODBC數據庫的表示方法,還有一種Oracle的表示方法就是全部用“?”號。例如:

    query.prepare("insert into student(id, name) "
                      "values (?, ?)");
    query.bindValue(0, 5);
    query.bindValue(1, "sixth");
    query.exec();
    

    也可以利用addBindValue()函數,這樣就可以省去編號,它是按順序給屬性賦值的,如下:

    query.prepare("insert into student(id, name) "
                      "values (?, ?)");
    query.addBindValue(5);
    query.addBindValue("sixth");
    query.exec();
    

    當用ODBC的表示方法時,我們也可以將編號用實際的占位符代替,如下:

    query.prepare("insert into student(id, name) "
                          "values (:id, :name)");
    query.bindValue(":id", 5);
    query.bindValue(":name", "sixth");
    query.exec();
    

    以上各種形式的表示方式效果是一樣的。

    2.3.2 用insert into語句

        //! 單條導入
        mySqlQuery.exec("insert into student values(3,'wang han','Chinese')");

    2.4  查詢表內容 

     可以用select語句查詢表內容

       //! 查找表中id >=1 的記錄的id項和name項的值
        mySqlQuery.exec("select * from student where id >= 1");
    
        //! query.next()指向查找到的第一條記錄,然后每次后移一條記錄
        QSqlRecord mySqlRec = mySqlQuery.record();
        while(mySqlQuery.next())
        {
            //! 獲取query所指向的記錄在結果集中的編號
            int nRowNum = mySqlQuery.at();
            //! 獲取每條記錄中屬性(即列)的個數
            int nColumnNum = mySqlQuery.record().count();
            //! 獲取"name"屬性所在列的編號,列從左向右編號,最左邊的編號為0
            int nFieldNo = mySqlQuery.record().indexOf("name");
            nFieldNo     = mySqlRec.indexOf("course");
            //! 獲取id屬性的值,并轉換為int型
            int stud_id = mySqlQuery.value(0).toInt();
            //! 獲取name屬性的值
            QString stud_name = mySqlQuery.value(1).toString();
            //! 獲取course屬性的值
            QString stud_course = mySqlQuery.value(2).toString();
            //! 輸出結果
            qDebug() << nRowNum << nColumnNum << nFieldNo << stud_id << stud_name << stud_course;
        }
    
        //! 定位到結果集中編號為2的記錄,即第三條記錄,因為第一條記錄的編號為0
        qDebug() << "exec seek(2) :";
        if(mySqlQuery.seek(2))
        {
            qDebug() << "rowNum is : " << mySqlQuery.at()
                     << " id is : " << mySqlQuery.value(0).toInt()
                     << " name is : " << mySqlQuery.value(1).toString();
        }
        //! 定位到結果集中最后一條記錄
        qDebug() << "exec last() :";
        if(mySqlQuery.last())
        {
            qDebug() << "rowNum is : " << mySqlQuery.at()
                     << " id is : " << mySqlQuery.value(0).toInt()
                     << " name is : " << mySqlQuery.value(1).toString();
        }

    輸出結果 

    在前面的程序中,我們使用

    mySqlQuery.exec("select * from student where id >= 1");

    查詢出表中所有的內容。其中的SQL語句“select * from student”“*”號表明查詢表中記錄的所有屬性。而當mySqlQuery.exec("select * from student");這條語句執行完后,我們便獲得了相應的執行結果,因為獲得的結果可能不止一條記錄,所以稱之為結果集。

    結果集其實就是查詢到的所有記錄的集合,在QSqlQuery類中提供了多個函數來操作這個集合,需要注意這個集合中的記錄是從0開始編號的。最常用的操作有:

    • seek(int n)query指向結果集的第n條記錄;
    • first()query指向結果集的第一條記錄;
    • last()query指向結果集的最后一條記錄;
    • next()query指向下一條記錄,每執行一次該函數,便指向相鄰的下一條記錄;
    • previous()query指向上一條記錄,每執行一次該函數,便指向相鄰的上一條記錄;
    • record() :獲得現在指向的記錄;
    • value(int n) :獲得屬性的值。其中n表示你查詢的第n個屬性,比方上面我們使用“select * from student”就相當于“select id, name from student”,那么value(0)返回id屬性的值,value(1)返回name屬性的值。該函數返回QVariant類型的數據,關于該類型與其他類型的對應關系,可以在幫助中查看QVariant。
    • at() :獲得現在query指向的記錄在結果集中的編號。

    需要特別注意,剛執行完mySqlQuery.exec("select *from student");這行代碼時,mySqlQuery是指向結果集以外的,我們可以利用mySqlQuery.next()使得mySqlQuery指向結果集的第一條記錄。當然我們也可以利用seek(0)函數或者first()函數使mySqlQuery指向結果集的第一條記錄。但是為了節省內存開銷,推薦的方法是,在mySqlQuery.exec("select * from student");這行代碼前加上mySqlQuery.setForwardOnly(true);這條代碼,此后只能使用next()seek()函數。

    2.5 刪除表內容 

    2.5.1 DROP 語句        

    用來刪除整表,并且連表結構也會刪除,刪除后則只能使用CREATE TABLE來重新創建表

        //! 刪除表內容
        mySqlQuery.exec("drop table student");

    2.5.2 TRUNCATE語句

     在SQLite中沒有該語句,在MySQL中有該語句,用來清楚表內數據,但是表結構不會刪除.

    2.5.3 DELETE語句      

    刪除部分記錄,并且表結構不會刪除,刪除的速度比上面兩個語句慢,可以配合WHERE來刪除指定的某行

    1) 刪除整個表 

    mySqlQuery.exec("delete table student");

     

     2) 刪除某行

    mySqlQuery.exec("delete from student where id = 1");

     

    2.6 修改表內容 

    2.6.1 update

    UPDATE 語句用于更新表中已存在的記錄。

    SQL UPDATE 語法

    UPDATE table_name
    SET column1=value1,column2=value2,...
    WHERE some_column=some_value;

        //! 修改表內容
        mySqlQuery.exec("update student set course = 'Chinese' where id = 1");

    2.6.2 alter語句 

    1) 如需在表中添加列,請使用下面的語法:

    ALTER TABLE table_name ADD column_name datatype

    mySqlQuery.exec("alter table student add score int");

    2)  如需刪除表中的列,請使用下面的語法(請注意,某些數據庫系統不允許這種在數據庫表中刪除列的方式,該行在SQlite中不能用,SQlite不支持drop):

    ALTER TABLE table_name DROP COLUMN column_name

    3) 要改變表中列的數據類型,請使用下面的語法:

    ALTER TABLE table_name ALTER COLUMN column_name datatype

     參考資料:

    1. SQlite在已創建的表中刪除一列

    2.42.QT-QSqlQuery類操作SQLite數據庫(創建、查詢、刪除、修改)詳解

     

     

     

     

     

     

     

     

     

     

     

     

    版權聲明:本文為a8039974原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/a8039974/article/details/104328649

    智能推薦

    Qt下Sqlite數據庫操作

     Sqlite數據庫作為Qt項目開發中經常使用的一個輕量級的數據庫,可以說是兼容性相對比較好的數據庫之一(Sqlite就像Qt的親兒子,如同微軟兼容Access數據庫一樣)。關于Sqlite和Qt的千絲萬縷的故事,有機會再說(各位看官查一查也可以自己search一下)。這里簡單說說Sqlite數據庫的用法吧。 一、sql語句和部分接口函數 1、在.pro文件中記得增加 : 2、sqlit...

    Qt中使用SQLite數據庫

    前言 SQLite(sql)是一款開源輕量級的數據庫軟件,不需要server,可以集成在其他軟件中,非常適合嵌入式系統。 Qt5以上版本可以直接使用SQLite(Qt自帶驅動)。 用法 1 準備 引入SQL模塊 在Qt項目文件(.pro文件)中,加入SQL模塊: 引用頭文件 在需要使用SQL的類定義中,引用相關頭文件。例如: 2 使用 1. 建立數據庫 檢查連接、添加數據庫驅動、設置數據庫名稱、數...

    QT操作sqlite數據庫匯總

    QT自帶的QSqlite數據庫中實現id主鍵自增長 QSqlite是QT自帶的輕量級數據庫,使用起來非常方便,對系統環境也沒有任何的環境要求,可移植性非常好,適合數據量不是太大,要求不是太高的程序。本文中,就介紹一點,怎么實現在QSqlite中的數據表實現id自增長,方法很簡單。 一、創建數據表時,主鍵設置為id,并且數據類型設置為integer。設置成integer的主鍵,默認自增長。 crea...

    IOS學習筆記15——SQLite數據庫

    SQLite是MySQL的簡化版,更多的運用與移動設備或小型設備上。SQLite的優點是具有可移植性,它不需要服務器就能運行,同時,它也存在一些缺陷,首先,沒有提供簡單的數據庫創建方式,必須手工創建數據庫,其次,SQLite沒有面向對象接口,必須使用依賴于C語言代碼的API。相對于OC,這套API既不那么優雅,也更難使用。當相比于用文件進行存儲,還是更推薦使用SQLite進行數據存儲。 下面來看下...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    猜你喜歡

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    精品国产乱码久久久久久蜜桃不卡