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将更具优势。