QT之SQLITE3數據庫
目錄
一、數據庫簡介
數據庫是用來存儲和管理數據的專用軟件,使得管理數據更加安全,方便和高效。數據庫對數據的管理的基本單位是表(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 | 浮點型 |
char | 8000 | 定長的unicode字符類型 |
varchar | 8000 | 變長的unicode字符類型(根據使用長度自動分配) |
text | 2G | 變長的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;
智能推薦
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...
猜你喜歡
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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...