您当前的位置: 首页 >  sql

风间琉璃•

暂无认证

  • 0浏览

    0关注

    337博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

QT之SQLITE3数据库

风间琉璃• 发布时间:2022-08-31 15:30:11 ,浏览量:0

目录

一、数据库简介

二、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 scoresetHorizontalHeaderItem(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 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()            
关注
打赏
1665385461
查看更多评论
0.0650s