您的位置:首页 > 编程语言 > Qt开发

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

2017-10-24 16:24 330 查看

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,
b8a9
artist) VALUES (?,?)");

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


同时Qt是不会对SQL语句进行拼写检查的。而使用QSqlTableModel则没有这两个个问题,因为它本身就是使用的高级接口,不直接使用SQL语句,完全可以输入Qt支持的任意字符,而且所有函数操作都有Qt的拼写检查。另外,虽然SQL语法简洁,但在数据库的可视化上,易于使用的model将更具优势。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt sqlite 数据库