Qt学习17——初识数据库SQLite(下)

版权声明:欢迎转载和收藏。转载请注明出处,谢谢! https://blog.csdn.net/u014266675/article/details/78331056

SQLite的操作

摘要:主要介绍SQLite的基本操作(查询、插入、修改、删除)用QSqlTableModel和QSqlQuery的分别实现。数据库使用 Navicat for SQLite(一个数据库管理工具) 进行查看和管理。

一、查询

查询title = 'Dapartures'的一行数据。

代码实现:

@sqlconnection.cpp

bool SqlConnection::SelectData() {
    /***model operation***/
    QSqlTableModel model;
    model.setTable("music");
    model.setFilter("title = 'Dapartures'");

    if (model.select()) {
        for (int i = 0; i < model.rowCount(); ++i) {
            //print operation record
            QSqlRecord record = model.record(i);
            QString title = record.value("title").toString();
            QString artist = record.value("artist").toString();
            qDebug() <<"select:"<< title << " - " << artist;
        }
    }

    /***SQL operation***/
    //    QSqlQuery query;
    //    query.exec("SELECT * FROM music WHERE title = 'Dapartures'");

    return true;
}

运行结果:

"小城故事" | "邓丽君"
"她" | "朱婧汐"
"Dapartures" | "EGOIST"
select: "Dapartures"  -  "EGOIST"

这里写图片描述

建立数据库和录入的数据还是使用上一篇中讲述的方法。这里实例化一个QSqlTableModel作为数据库的model,此时对数据库的操作可以使用非SQL语句进行,同时更方便与view的结合。这里select操作是通过setFilter()实现的。代码中,QSqlRecord用于记录数据库的操作,这里我将它打印出来便于查看。另外,我也附上了SQL语法实现的代码*(注释部分)*


二、插入

在当前目录底部插入一行数据:
title = "南方姑娘"
artist = "赵雷"

代码实现:

@sqlconnection.cpp

bool SqlConnection::InsertData() {
    /***model operation***/
    QSqlTableModel model;
    model.setTable("music");
    int row = 0;
    model.insertRows(row, 1);
    model.setData(model.index(row, 1), QString::fromLocal8Bit("南方姑娘"));
    model.setData(model.index(row, 2), QString::fromLocal8Bit("赵雷"));
    model.submitAll();
    //print operation record
    QSqlRecord record = model.record(0);
    QString title = record.value("title").toString();
    QString artist = record.value("artist").toString();
    qDebug() <<"insert:"<< title << ":" << artist;

    /***SQL operation***/
    //    QSqlQuery query;
    //    query.exec("INSERT INTO music (title, artist) VALUES ('New title', 'New artist')");

    return true;
}

运行结果:

"小城故事" | "邓丽君"
"她" | "朱婧汐"
"Dapartures" | "EGOIST"
insert: "南方姑娘" : "赵雷"

这里写图片描述

这里用row选定插入的目录,insertRows()可以插入多行,这里插入一行。setData()设置插入的位置。


三、修改

id = 1的数据title值由"小城故事"修改为"新小城故事"

代码实现:

@sqlconnection.cpp

bool SqlConnection::UpdateData() {
    /***model operation***/
    QSqlTableModel model;
    model.setTable("music");
    model.setFilter("id = 1");
    if (model.select()) {
        if (model.rowCount() == 1) {
            QSqlRecord record = model.record(0);
            record.setValue("title", QString::fromLocal8Bit("新小城故事"));
            model.setRecord(0,record);
            model.submitAll();
            //print operation record
            QString title = record.value("title").toString();
            QString artist = record.value("artist").toString();
            qDebug() <<"update:"<< title << ":" << artist;
        }
    }

    /***SQL operation***/
    //    QSqlQuery query;
    //    query.exec("UPDATE music SET title = 'New title' WHERE id = 1");

    return true;
}

运行结果:

"小城故事" | "邓丽君"
"她" | "朱婧汐"
"Dapartures" | "EGOIST"
update: "新小城故事" : "邓丽君"

这里写图片描述


四、删除

删除id = 2的一行数据。

代码实现:

@sqlconnection.cpp

bool SqlConnection::DeleteData() {
    /***model operation***/
    QSqlTableModel model;
    model.setTable("music");
    model.setFilter("id = 2");
    if (model.select()) {
        //print operation record
        QSqlRecord record = model.record(0);
        QString title = record.value("title").toString();
        QString artist = record.value("artist").toString();
        qDebug() <<"delete:"<< title << ":" << artist;

        model.removeRows(0,1);
        model.submitAll();
    }

    /***SQL operation***/
    //    QSqlQuery query;
    //    query.exec("DELETE FROM music WHERE id = 4");

    return true;
}

运行结果:

"小城故事" | "邓丽君"
"她" | "朱婧汐"
"Dapartures" | "EGOIST"
delete: "她" : "朱婧汐"

这里写图片描述

五、说明

在上面的增、删、改、查操作中,可以发现似乎使用SQL语句比使用高级接口QSqlTableModel代码要简洁得多。但是在操作中文字符时还是比较麻烦的,因为操作语法中是不能直接输入中文字符的,我们可以使用prepare()addBingValue()来插入数据,例如:

QSqlQuery query;
    query.prepare("INSERT INTO music (title, artist) VALUES (?,?)");

    QStringList titles;
    titles <<QString::fromLocal8Bit("小城故事")<< QString::fromLocal8Bit("她") << "Dapartures";
    query.addBindValue(titles);

同时Qt是不会对SQL语句进行拼写检查的。而使用QSqlTableModel则没有这两个个问题,因为它本身就是使用的高级接口,不直接使用SQL语句,完全可以输入Qt支持的任意字符,而且所有函数操作都有Qt的拼写检查。另外,虽然SQL语法简洁,但在数据库的可视化上,易于使用的model将更具优势。

猜你喜欢

转载自blog.csdn.net/u014266675/article/details/78331056
今日推荐