【Qt】数据库(一)SQLITE创建、增删查改

时间:2024-05-31 20:52:12

填坑1:如何连续插入

汇总SQlite语句
创建表格:create table <table_name> (f1 type1, f2 type2,…);
增:insert into <table_name> values (value1, value2,…);
改:update <table_name> set <f1=value1>, <f2=value2>… where ;
查:select , , … from <table_name>;
删:delete from <table_name> where =
删全部:delete from <table_name>

Step1:准备工作

创建项目
在qmake中(.pro文件)引入依赖:QT += sql
image.png
引入头文件

#include <QSqlDatabase>   //创建数据库
#include <QSqlError>
#include <QSqlQuery>      //针对数据库进行一些操作
#include <QMessageBox>    //提示弹窗,这个可以不加

Step2:创建(配置)和关闭

2.1 创建(打开)数据库

在类中创建一个bool型的函数,创建并配置一个数据库

bool MainWindow::createConnection()//创建并配置数据库
{
    //建立了一个QSqlDatabase对象,后续的操作要使用这个对象
    QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");//Sqlite数据库
    database.setHostName("127.0.0.1");//连接地址
    database.setDatabaseName("MyDataBase_sqlite.db");//命名数据库
    database.setUserName("ShengQiang");//用户名
    database.setPassword("123456");//密码

    if (!database.open()) {//如果数据库连接失败,则弹出
        QMessageBox::critical(0, "Cannot open database",
                              "Unable to establish a database connection", QMessageBox::Cancel);
        return false;
    }
    else{//如果数据库连接成功,则弹出
        QMessageBox::information(0, "Succeed", "Good Luck!",QMessageBox::Ok);
    }
    return true;
}

通常我们需要不断判断数据库是否已创建,而不是一直创建一个数据库,所以我们可以通过if判断数据库是否已经创建了。
image.png

2.2 关闭数据库

数据库操作完成后,最好关闭。下次用到了再重新打开。

database.close();//database是自己创建的数据库变量

Step3:操作(增删查改)

3.1 创建表格

创建一个名为student的表格,表格包含三列,第一列是id,第二列是名字,第三列是年龄。

QSqlQuery sql_query;
QString create_sql = "create table student (id int primary key, name varchar(30), age int)";
sql_query.prepare(create_sql);
if(!sql_query.exec())
{
    qDebug() << "Error: Fail to create table." << sql_query.lastError();
}
else
{
    qDebug() << "Table created!";
}

代码解释:
(1)第一行定义一个QSqlQuery对象。
(2)第二行是一个QString,其中的内容是SQLite语句。对数据库的操作,都是用SQLite的语句完成的,把这些指令以QString类型,通过prepare函数,保存在QSqlQuery对象中。也可将指令,以QString形式直接写在exec()函数的参数中,例如:

sql_query.exec("create table student (id int primary key, name varchar(30), age int)");

创建表格语句:create table <table_name> (f1 type1, f2 type2,…);
create table是创建表格的语句,也可用大写CREATE TABLE;student是表格的名称,可以任意取;括号中是表格的格式,上述指令表明,表格中有三列,第一列的名称(表头)是id,这一列储存的数据类型是int,第二列名称是name,数据类型是字符数组,最多有30个字符(和char(30)的区别在于,varchar的实际长度是变化的,而char的长度始终是给定的值),第三列的名称是age,数据类型是int。
如果sql_query.exec()执行成功,则创建表格成功。

3.2 增

在刚才创建的表格中,插入一行数据。

    database.open();
    QSqlQuery sql_query;
    //在插入数据时,不需要手动指定id字段的值,因为SQLite会为您自动生成。您只需要绑定其他字段的值
    QString insert_sql = "INSERT INTO student (name, age) VALUES (?, ?)";
    sql_query.prepare(insert_sql);
    //sql_query.addBindValue(10);
    sql_query.addBindValue("Wang");
    sql_query.addBindValue(25);
    if(!sql_query.exec())
    {
        qDebug() << sql_query.lastError();
    }
    else
    {
        qDebug() << "inserted Wang!";
    }
    //第二种插入方法
//    if(!sql_query.exec("INSERT INTO student VALUES(9, \"Li\", 23)"))
//    {
//        qDebug() << sql_query.lastError();
//    }
//    else
//    {
//        qDebug() << "inserted Li!";
//    }
    //    database.close();

插入语句:insert into <table_name> values (value1, value2,…);
insert into是插入语句,student是表格名称,values()是要插入的数据。这里,我们插入了2组数据。插入第一组数据的时候,用addBindValue来替代语句中的?,替代的顺序与addBindValue调用的顺序相同。插入第二组数据的时候,则是直接写出完整语句。

3.3 改

例3:更新数据(修改数据)
QString update_sql = "update student set name = :name where id = :id";
sql_query.prepare(update_sql);
sql_query.bindValue(":name", "Qt");
sql_query.bindValue(":id", 1);
if(!sql_query.exec())
{
    qDebug() << sql_query.lastError();
}
else
{
    qDebug() << "updated!";
}

语句:update <table_name> set <f1=value1>, <f2=value2>… where ;
更新(修改)的语句是update…set…,其中student是表格名称,name是表头名称(即第二列),:name是待定的变量,where用于确定是哪一组数据,:id也是待定变量。
bindValue(" ", " ")函数用来把语句中的待定变量换成确定值。

3.4 查

3.4.1 查部分数据

QString select_sql = "select id, name from student";
if(!sql_query.exec(select_sql))
{
    qDebug()<<sql_query.lastError();
}
else
{
    while(sql_query.next())
        {
            int id = sql_query.value(0).toInt();
            QString name = sql_query.value(1).toString();
            qDebug()<<QString("id:%1    name:%2").arg(id).arg(name);
        }
}

语句select , , … from <table_name>;
select是查询指令; 等等是要查询的变量(即表头),中间用逗号隔开;from …指定表格。
上述语句是说查询student表中的 id 和 name 。执行查询之后,用sql_query.value(int)来获得数据。同样地,value(0)表示第一个数据,即 id,value(1)表示name。注意:value()函数的返回值类型是QVariant,因此要用toInt()等函数转换成特定的类型。
3.4.2 查全部数据

QString select_all_sql = "select * from student";
sql_query.prepare(select_all_sql);
if(!sql_query.exec())
{
    qDebug()<<sql_query.lastError();
}
else
{
    while(sql_query.next())
        {
            int id = sql_query.value(0).toInt();
            QString name = sql_query.value(1).toString();
            int age = sql_query.value(2).toInt();
            qDebug()<<QString("id:%1    name:%2    age:%3").arg(id).arg(name).arg(age);
        }
}

语句select * from <table_name>;
查询所有数据用 * 表示。用while(sql_query.next())用来遍历所有行。同样用value()获得数据。
3.4.3 查询最大id

QString select_max_sql = "select max(id) from student";
int max_id = 0;
sql_query.prepare(select_max_sql);
if(!sql_query.exec())
{
    qDebug() << sql_query.lastError();
}
else
{
    while(sql_query.next())
        {
            max_id = sql_query.value(0).toInt();
            qDebug() << QString("max id:%1").arg(max_id);
        }
}

3.5 删

3.5.1 删除一条数据

QString delete_sql = "delete from student where id = ?";
sql_query.prepare(delete_sql);
sql_query.addBindValue(0);
if(!sql_query.exec())
{
    qDebug()<<sql_query.lastError();
}
else
{
    qDebug()<<"deleted!";
}

语句delete from <table_name> where =
delete用于删除条目,用where给出限定条件。例如此处是删除 id = 0的条目。
3.5.2 清空表格(删除所有)

QString clear_sql = "delete from student";
sql_query.prepare(clear_sql);
if(!sql_query.exec())
{
    qDebug() << sql_query.lastError();
}
else
{
    qDebug() << "table cleared";
}