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

来源:互联网 发布:eui魔兽盒子mac版 编辑:程序博客网 时间:2024/05/17 02:33

SQLite的操作

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

一、查询

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

代码实现:

@sqlconnection.cppbool 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.cppbool 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.cppbool 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.cppbool 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将更具优势。