• <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之SQLITE3數據庫

    標簽: QT  sqlite  數據庫

    目錄

    一、數據庫簡介

    二、Linux下使用sqlite3

    三、SQL語句

    1.Create Table

    2.Drop Table

    3.Truncate Table

    4.Insert Into

    5.Select

    6.Delete

    7.Update

    8.Alter Table

    9.約束

     四、Sqlite3類

    1.QSqlDatabase

     2.QSqlQuery

    3.QStandardItemMode

    4.QSqlTableModel

    5.QSqlQueryModel

    五、數據庫簡單加密


    一、數據庫簡介

    數據庫是用來存儲和管理數據的專用軟件,使得管理數據更加安全,方便和高效。數據庫對數據的管理的基本單位是表(table)。

    常見的數據庫:

    大型數據庫(大型機) ----------- Oracle(億級)

    中型數據庫(分布式超大型) -------- mysql(百萬級)

    輕型數據庫(嵌入式設備) -------- sqlite(萬級)

    訪問數據庫使用SQL語句,適用于所有的數據庫。 

    二、Linux下使用sqlite3

    sudo apt-get update

    sudo apt-get install sqlite3

    sqlite3使用指令

    sqlite3 數據庫文件的路徑   //打開、創建數據庫

    sqlite3 first.db  //打開數據庫成功后會進入命令行 

    基本操作命令:

    .exit/.quit -------- 退出數據庫命令行

    .help -------------- 幫助說明信息

    .tables ------------ 查看當前數據庫中所有的表

    三、SQL語句

    基本語法: 所有的SQL語句都以分號(;)結束并且不區分大小寫。 

    1.Create Table

    create table 表名(字段名1 字段類型1,字段名2 字段類型2,字段名3 字段類型3,...);

    表格是數據庫中儲存資料的基本架構。在絕大部份的情況下,數據庫廠商不可能知道您需要如何儲存您的資料,所以通常您會需要自己在數據庫中建立表格。

    //創建一個stutbl的表,表中有3個字段
    //分別是整數類型的學號id,字符串類型的name和整數類型的age
    create table stutbl(id int,name char[20],age int);
    
    //不存在則創建
    create table if not exists stutbl(id int,name char[20],age int);
    
    //如果希望表中某個字段的內容不重復,可以用unique修飾該字段
    create table if not exists stutbl(id int unique,name char[20],age int);

    字段數據類型:

    類型范圍說明
    int/integer-2^32---2^32-1整型
    float-1.79E+308至1.79E+308浮點型
    real-3.04E+38至3.04E+38浮點型
    char8000定長的unicode字符類型
    varchar8000變長的unicode字符類型(根據使用長度自動分配)
    text2G變長的unicode字符類型,文本類型

    2.Drop Table

    從數據庫中清除一個表格
     

    drop table 表名;

     3.Truncate Table

    清除一個表格中的所有數據

    truncate table  表名

    4.Insert Into

    insert into 表名 values(字段值1,字段值2,字段值3,....);
    //字段值如果是字符串,必須用''(單引號)括起來

    示例:

    insert into stutbl values(1001,'張飛',23);
    insert into stutbl values(1002,'趙云',19);
    insert into stutbl values(1003,'劉備',31);

    stutbl表格內容如下:

     5.Select

    select * from 表名;  //查詢表中的所有數據
    select 字段名, 字段名 form 表格名; //查詢結果顯示兩個字段對應的數據
    

     條件查詢(where)

    select * form  表格名 where 條件; //查詢滿足條件的數據
    
    

    示例:

    create table if not exists testtbl(id int unique,name char[20],class int,grade int,age int,score float);
    
    INSERT INTO TESTTBL VALUES(1001,'lily',4,3,9,78.5);
    INSERT INTO TESTTBL VALUES(1002,'黃國桐',6,7,12,88.5);
    INSERT INTO TESTTBL VALUES(1003,'秦逍',3,5,23,91.0);
    INSERT INTO TESTTBL VALUES(1004,'韋申姿',9,2,16,81.5);
    
    //查找:
    
    1.使用where指定查詢條件
        select * from testtbl where class=6;//查詢class值為6的條目
        select * from testtbl where score>=90 or score<80;
    
    2.指定查詢的字段
        select id,name,score from testtbl;//只查詢id,name,score的字段 
    
    3.使用where+like實現模糊查詢
        select * from testtbl where name like '黃%';//查找名字以黃開頭的條目
    
    4.使用order by實現查詢結果按某個字段的值升序/降序輸出
        select * from testtbl order by score desc;//按分數降序排序     
       select * from testtbl order by grade asc;//按年級升序排序    

    6.Delete

    刪除表中的條目

    delete from 表名 where 條件;//刪除所有符合條件的條目

    7.Update

    更新(修改)表中的條目

    update 表名 set 字段名1=字段值1,字段名2=字段值2... where 條件;//修改符合條件的條目

    示例:修改id為1002的年齡為17,分數為95.5

    update testtbl set age=17,score=95.5 where id=1002;

    8.Alter Table

    修改表格,添加某一個字段

    alter table 表名 add column  字段名稱 字段類型;

    9.約束

    主鍵(primary key): 在表格中是唯一的,一個表格中只允許存在一個主鍵

    integer類的主鍵,可以設置為autoincrement:自增長

    NOT NULL值不能為NULL

    unique 值唯一

    default 設置字段默認值

    create table student(id integer priary key autoincrement,#主鍵,自動增長
                         name varchar(32) NOT NULL,#設置名字不能為空
                         sex varchar(8),
                         phone text UNIQUE,#設置值唯一
                         regtime TimeStamp NOT NULL default (datetime('now','localtime'))
    
    );

     四、Sqlite3類

    1.QSqlDatabase

    QSqlDatabase提供了一系列的接口用于訪問操作數據庫,包括連接數據庫,輸入sql語句。QSqlDatabase的實例表示著一個對數據庫的連接。該連接通過一個受支持的數據庫驅動程序(從QSqlDriver派生)提供對數據庫的訪問。
     

    數據庫驅動類 ----------- QSqlDatabase

    1.添加數據庫驅動

    [static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String(defaultConnection));

    //第一個參數需要傳入添加的數據庫類型,比如使用sqlite就穿"QSQLITE"

    //第二個參數選擇默認連接方式即可

    2.設置數據庫文件路徑: 傳入數據庫文件的路徑,添加數據庫驅動成功后才能調用該函數

    void QSqlDatabase::setDatabaseName(const QString &name);

    3.打開數據庫

    bool QSqlDatabase::open();

     //添加數據庫驅動
     db = QSqlDatabase::addDatabase("QSQLITE");
     //指定數據庫文件路徑
     db.setDatabaseName("stu.db");
     //打開數據庫
     if(!db.open())
    {
            QMessageBox::warning(this,"提示","打開數據庫失敗");
    }

     2.QSqlQuery

    Qt中對數據庫的操作主要通過QSqlQuery實現,QSqlQuery提供了執行數據庫語句的方法,在Qt中利用QSqlQuery類實現了執行SQL語句。

    執行SQL語句的類 -------- QSqlQuery 在執行時才創建該對象

    1.執行sql語句

    傳入要執行的sql語句(不需要加分號),不傳參數就執行構造時的sql語句

    /返回執行成功/失敗

    bool QSqlQuery::exec(const QString &query);

    2.獲取錯誤原因

    QSqlError QSqlQuery::lastError() const; //需要添加 <QSqlError>頭文件

    3.獲取sql語句執行的結果(查詢)

    每調用一次取出一條結果,返回的結果是在對象中,通過value成員函數獲取

    bool QSqlQuery::next();

    4.獲取字段值

    QVariant QSqlQuery::value(int index) const;//通過編號獲取字段值 QVariant QSqlQuery::value(const QString &name) const;//通過字段名獲取字段值

    QSqlQuery query;
    QString sql;
    sql = QString("insert into user_table('編號','姓名','性別','身份')                 
                 values('%5','%6','%7','%8')")\
                .arg(value1).arg(value2).arg(value3).arg(value4);
    query.exec(sql);

    3.QStandardItemMode

    QStandardItemModel 是標準的以項數據(item data)為基礎的標準數據模型類,通常與QTableView 組合成 Model/View 結構,實現通用的二維數據的管理功能。QStandardItemModel:基于項數據的標準數據模型,可以處理二維數據。維護一個二維的項數據數組,每個項是一個 QStandardltem 類的變量,用于存儲項的數據、字體格式、對齊方式。

    //構造函數

    QStandardItemModel::QStandardItemModel(int rows, int columns, QObject *parent = nullptr)

    //設置列頭部標題: 傳入的是QStandardItem 類型

    setHorizontalHeaderItem(列,QStandardItem *item);

    //設置單元格內容

    setItem(行,列,QStandardItem *item);

    //刪除指定的行:

    removeRows(起始行號,行數);

    //獲取行數:rowCount();

    //清空:clear();

    要把QStandardItemMode模型對象中的內容顯示出來,需要將模型對象和表格對象(tableview)綁定,綁定后模型的內容就會同步顯示到表格中

    QTableView的成員函數: setModel(模型對象); //為表格綁定模式對象

    QStandardItemModel *model; //一般寫到類的私有成員中  
    //初始化模型
    model = new QStandardItemModel(this);
    
    model->setHorizontalHeaderItem(0,new QStandardItem("id"));
    model->setHorizontalHeaderItem(1,new QStandardItem("name"));
    model->setHorizontalHeaderItem(2,new QStandardItem("age"));
    //綁定模型和表格
    ui->tableView->setModel(model);

     效果如下:

     總之,QTableView是表示圖控件、QStandardItemModel是標準數據模型、QItemSelectionModel用來響應消息和出發信號和事件,QStandardItem是QStandardItemModel 的數據管理的基本單元。

    4.QSqlTableModel

    QSqlTableModel用來顯示數據庫中數據表的數據,實現對數據的編輯、插入、刪除等操作實現數據的排序和過濾

    QSqlTableModel將SQL語句對數據庫的訪問完全對象化,將SQL語句的執行封裝成對象及其成員函數的實現,同時也對象化了Qt的表格界面,實現了數據庫訪問的高耦合性,屏蔽了數據庫訪問的內部細節,將數據庫的訪問簡化成調用對象的接口(成員函數)。

    1.綁定表(數據庫的表)  --------- setTable

    [virtual] void QSqlTableModel::setTable(const QString &tableName); //傳入數據庫表格名

    2.插入數據

    //插入一條記錄:  先構建一條QSqlRecord,在插入

    bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record);

    //插入一行

    bool QAbstractItemModel::insertRow(int row, const QModelIndex &parent = QModelIndex());

    3.提交模型到數據庫 --------- submit/submitAll

    [override virtual slot] bool QSqlTableModel::submit(); [slot] bool QSqlTableModel::submitAll();

    4.查詢 ---------- select()

    [virtual slot] bool QSqlTableModel::select();

    注:每次查詢后應該重新綁定表格,如果要顯示要綁定模型和表格界面

    查找并設置過濾器

    [virtual] void QSqlTableModel::setFilter(const QString &filter);//傳入的字符串格式"字段名=字段值"

    查找并排序

    [virtual] void QSqlTableModel::setSort(int column, Qt::SortOrder order);

    Qt::AscendingOrder --- 升序       Qt::DescendingOrder --- 降序

    5.從模型刪除行 -------- removeRow/removeRows

    [override virtual] bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex());    //傳入從哪一行開始刪除多少行

    //返回當前模型的行數

    [override virtual] int QSqlTableModel::rowCount(const QModelIndex &parent = QModelIndex()) const; 

    //刪除指定行

    bool QAbstractItemModel::removeRow(int row, const QModelIndex &parent = QModelIndex()); 

    6.修改 --------- (查詢+插入)

    ①.//獲取QSqlRecord

    QSqlRecord QSqlTableModel::record() const;//獲取一條空記錄 QSqlRecord QSqlTableModel::record(int row) const ;   //獲取指定行的記錄

    ②.//QSqlRecord的修改字段值的函數

    void QSqlRecord::setValue(int index, const QVariant &val); void QSqlRecord::setValue(const QString &name, const QVariant &val);

    ③.//將修改好的記錄寫回模型

    bool QSqlTableModel::setRecord(int row, const QSqlRecord &values);

    法二:直接修改模型中的數據 ------ setData

    //傳入要修改的位置編號和內容

    [override virtual] bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);

    //通過行和列求編號

    [override virtual] QModelIndex QAbstractTableModel::index(int row, int column, const QModelIndex &parent = ...) const;

    7.撤銷修改 ------ revert/revertAll

    [override virtual slot] void QSqlTableModel::revert();

    [slot] void QSqlTableModel::revertAll();

    QSqlTableModel *model;//數據庫數據模型
    
    QSqlDatabase db;
    
    //添加數據庫驅動
    db = QSqlDatabase::addDatabase("QSQLITE");
    //指定數據庫文件路徑
    db.setDatabaseName("stu.db");
    //打開數據庫
    if(!db.open()){
        QMessageBox::warning(this,"提示","打開數據庫失敗");
    }
    
    //初始化模型
    model = new QSqlTableModel(this);
    //綁定模型和表格界面
    ui->tableView->setModel(model);
    
    //建表
    void SmartSQLStu::on_pushButton_create_clicked()
    {
        QString sql = QString("create table if not exists %1(id int unique,name ntext,age int)").
                        arg(ui->lineEdit_tablename->text());
        //執行sql ------ QSqlQuery對象在要執行時創建
        QSqlQuery query;
        if(!query.exec(sql)){
            QMessageBox::warning(this,"提示","建表失敗!");
            return;
        }
    
        model->setTable(ui->lineEdit_tablename->text());
        //設置提交后生效
        model->setEditStrategy(QSqlTableModel::OnManualSubmit);
        //顯示
        model->select();
    
        //禁止表名輸入框和建表按鈕
        ui->lineEdit_tablename->setEnabled(false);
        ui->pushButton_create->setEnabled(false);
    }
    
    //添加
    void SmartSQLStu::on_pushButton_insert_clicked()
    {
        //獲取當前行數
        int row = model->rowCount();
        model->insertRow(row);//最后一行后插入
        int id = 100;
        model->setData(model->index(row,0),id);
    
        //提交
        model->submitAll();
    }
    
    //保存
    void SmartSQLStu::on_pushButton_save_clicked()
    {
        model->submitAll();
    }
    
    //撤銷
    void SmartSQLStu::on_pushButton_revert_clicked()
    {
        model->revertAll();
    }
    
    //刪除
    void SmartSQLStu::on_pushButton_delete_clicked()
    {
        //從表格中獲取要刪除的行
        int delrow = ui->tableView->currentIndex().row();
        //刪除改行
        model->removeRow(delrow);
    
        //詢問詢問用戶是否真的刪除
        if(QMessageBox::Yes==QMessageBox::warning(this,"刪除","確定刪除本行嗎?",QMessageBox::Yes|QMessageBox::No)){
            model->submitAll();
        }
        else{
            //撤銷
            model->revert();
        }
    }
    //查詢
    void SmartSQLStu::on_pushButton_select_clicked()
    {
        model->setTable(ui->lineEdit_tablename->text());
        model->select();
    }
    

    5.QSqlQueryModel

    QSqlQueryModel作為數據模型從數據庫里查詢數據,只需要使用setQuery()函數設置一個select查詢語句即可。

    用QSqlQueryModel::setQuery設置sql查詢

    void QSqlQueryModel::setQuery ( const QSqlQuery & query )

    void QSqlQueryModel::setQuery ( const QString & query, const QSqlDatabase & db = QSqlDatabase() )

    QSqlQueryModel *sql_model = new QSqlQueryModel;
    sql_model->setQuery("SELECT* FROM user_table");
    
    tabelview->setModel(sql_model);
    tabelview->setEditTriggers(QAbstractItemView::NoEditTriggers);

    五、數據庫簡單加密

    MD5是一種將任意長度的數據變換得到128位2進制數據,無法通過128位2進制數據求的原始數據的加密方式。

    1.創建一個加密對象  //需要添加頭文件<QCryptographicHash>

    QCryptographicHash hash(QCryptographicHash::Md5);

    2.放入要加密的數據

    void QCryptographicHash::addData(const QByteArray &data); //hash.addData(password.toUtf8());

    3.獲取加密結果

    QByteArray QCryptographicHash::result() const;

    //hash.result();

    將用戶注冊的密碼進行加密

        //對密碼進行Md5的加密
        //1.創建QCryptographicHash加密對象
        QCryptographicHash hash(QCryptographicHash::Md5);
        //2.放入要加密的數據
        hash.addData(password.toUtf8());
        //3.取出加密結果
        QByteArray arr = hash.result();
        password = arr.toHex();
        qDebug()<<password;

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

    智能推薦

    sqlite3數據庫的基本操作

    SQLite 的數據庫權限只依賴于文件系統,沒有用戶帳戶的概念。SQLite 有數據庫級鎖定,沒有網絡服務器。 它需要的內存,其它開銷很小,適合用于嵌入式設備。你需要做的僅僅是把它正確的編譯到你的程序。 接口由SQLite C API組成,也就是說不管是程序、腳本語言還是庫文件,最終都是通過它與SQLite交互的(我們通常用得較多的ODBC/JDBC最后也會轉化為相應C API的調用)。 SQLi...

    C語言調用SQLITE3數據庫

    1 先包含頭文件 #include <sqlite3.h> 2 打開一個數據庫 舉例: 3 調用數據庫語句對數據庫進行操作 能做到這一點的有2條語句 (1)需要外加回調函數的 sqlite3_exec() 接著看看回調函數的原型 第一個參數 void* para 就是在 sqlite3_exec(),中的第三個參數,用于給回調函數傳入數據。 調用回調函數的原理是,數據庫執行 ...

    xcode移植sqlite3數據庫

    運行環境:macOS  開發環境:Xcode 9.4 本教程是在Xcode上開發C/C++,并且生成framework庫 1.首先去官網下載sqlite3源碼 1.1https://www.sqlite.org/download.html 1.2解壓得到文件4個文件,shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h。我們需要用到的是sqlite3.c和sq...

    sqlite3數據庫移植詳解

    前言   本文講述sqlite3數據庫的嵌入式設備移植過程并結合小例子說明如何使用sqlite3的庫進行編程。數據庫在程序開發過程中起到舉足輕重的作用,肩負著用戶和系統設置數據的保存、查找、增刪等操作,是程序運行的“糧食“。數據庫的提供商有很多,諸如oracle、candence、mysql、sqlite等。但是sqlite3作為一款高可靠性且小巧玲瓏的數據庫工具...

    sqlite3數據庫操作大全

    命令行操作 簡單的說些常用命令 之前我們已經對sqlite源碼進行了編譯,生成一個.exe文件 打開這個文件可以進入windows下的sqlite命令行操作界面 輸入下面兩行命令(命令都是以  .XXXX形式 ,語句都以  XXXXX;  形式) .open 打開demo.db數據庫,如果不存在則創建數據庫 .databases 查看當前已經打開的數據庫信息 .exi...

    猜你喜歡

    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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

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