有时候我们需要在软件中记录一些历史数据以便于对数据的查询。而我们希望软件不能太复杂,体量也不要太大,这个时候就需要如SQLite这样轻量级的数据库。这篇中我们就来讨论如何在使用QT开发应用是操作SQLite数据库。
SQLite是一款开源、轻量级、跨平台的数据库,无需Server,无需安装和管理配置。它的设计目标是嵌入式的,所以很适合小型应用,也是Qt应用开发种常用的一种数据库。
我们先设计一个简单的操作界面,最上面一行是六个操作按钮,分别实现数据库的连接、表格创建、数据查询,插入数据、修改数据以及删除数据。中间文纸是两个输入框,分别是输入姓名和年龄。最下面是一个图标显示。具体形式如下:
在开发之前,如果我们使用QtCreator则需要在*.pro中引入sql模块(QT+=sql),如果是VS中在Qt VS Tool里勾选上sql模块,就可以使用该模块的接口了。
QSqlDatabase类提供了一个接口,用于通过连接访问数据。SQLite在单个文件上运行,在打开连接时必须将其设置为数据库名称。如果该文件不存在,SQLite将尝试创建它。
我们实现一个连接数据库的函数,并在“连接数据库”按钮的槽函数中调用它来实现数据库的连接。具体的代码如下:
void MainWindow::ConnectDatabase()
{
if(QSqlDatabase::contains("qt_sql_default_connection"))
{
db = QSqlDatabase::database("qt_sql_default_connection");\
}
else
{
db = QSqlDatabase::addDatabase("QSQLITE");
}
db.setDatabaseName("DBTest.db");
}
在上述代码中,我们连接一个名称为“DBTest.db”的数据库,但这个数据库一开始是没有的,所以运行这段代码后会创建一个名为“DBTest.db”的数据库。运行完成后我们使用SQLiteStudio查看,发现已经创建了一个名为“DBTest.db”的数据库,并可一连接上。如下图:
接下来,我们创建一个数据表。其中QSqlQuery类可以使用SQL语句来实现与数据库交互。所以在这里我们使用该类操作SQL语句穿件一个数据表。在这里我们创建一个名为staff的表格,该表中包括3个字段:id字段作为主键并自动增长;name字段和age字段用于存储信息。具体代码如下:
void MainWindow::CreateTable()
{
const QString sql="CREATE TABLE IF NOT EXISTS staff (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,name CHAR (50) UNIQUE NOT NULL,age INTEGER)";
//QSqlQuery构造前,需要db已打开并连接
//未指定db或者db无效时使用默认连接进行操作
QSqlQuery query;
if(query.exec(sql))
{
qDebug()<<"init table success";
}
else
{
//打印sql语句错误信息
qDebug()<<"init table error";
}
}
运行完成创建表格命令后,我们使用SQLiteStudio查看数据的内容。连接数据库可以看到staff表格以及包含的3个字段,说明创建成功,具体如下图:
关于QSqlQuery类,他是封装在QSqlDatabase上,用以执行SQL查询中创建,导航和检索数据所涉及的功能。它可以被用来执行DML(数据操纵语言)语句,例如select、insert、update、delete,以及DDL(数据定义语言)语句,如create table。在后续的增、删、改、查等操作中也是使用该类。
我们已经创建了表格,接下来我们尝试向表格中添加数据。在这里我们使用QSqlQuery类中的prepare()方法来预设SQL语句,然后再通过bindValue()方法加入数据。具体实现代码如下:
void MainWindow::InsertData()
{
QSqlQuery query;
query.prepare("INSERT INTO staff (name,age) VALUES (:name,:age)");
query.bindValue(":name", ui->lineEditName->text());
query.bindValue(":age", ui->lineEditAge->text());
query.exec();
}
我们在操作界面中添加3条记录,分别在姓名框和年龄框中输入名字和年龄点击“插入数据”按钮实现对数据的插入。完成后显示如下:
接下来我们尝试对表中的数据进行修改。我们依然使用QSqlQuery类中的prepare()方法来预设SQL语句,然后再通过bindValue()方法加入数据。具体实现代码如下:
void MainWindow::UpdateData()
{
QSqlQuery query;
query.prepare("UPDATE staff SET age=:age WHERE name=:name");
query.bindValue(":name",ui->lineEditName->text());//通过自定义的别名来替代
query.bindValue(":age",ui->lineEditAge->text());
query.exec();
}
在这里我们尝试将第条记录修改一下,我们在姓名框中输入“Rose”,在年龄框中输入“31”,将Rose的年龄有28修改为31。输入完成点击“修改数据”按钮,结果如下:
接下来我们尝试删除数据。我们依然使用QSqlQuery类中的prepare()方法来预设SQL语句,然后再通过bindValue()方法加入数据。我们实现根据姓名来删除数据,具体实现代码如下:
void MainWindow::DeleteData()
{
QSqlQuery query;
query.prepare("DELETE FROM staff WHERE name=?");
query.addBindValue(ui->lineEditName->text());
query.exec();
}
我们删除第3条数据,我们在姓名框中输入“Rose”,然后点击“删除数据”按钮,得到结果如下:
最后我们来实现数据的查询问题。依然是使用QSqlQuery类,我们在这里使用查询表格全部内容的方式。具体的实现代码如下:
void MainWindow::QueryData()
{
ui->tableWidget->clear();
QStringList header;
header<<"id"<<"name"<<"age";
ui->tableWidget->setHorizontalHeaderLabels(header);
int i=0;
QSqlQuery query("SELECT * FROM staff");
while (query.next())
{
ui->tableWidget->setItem(i,0,new QTableWidgetItem(query.value(0).toString()));
ui->tableWidget->setItem(i,1,new QTableWidgetItem(query.value(1).toString()));
ui->tableWidget->setItem(i,2,new QTableWidgetItem(query.value(2).toString()));
i++;
}
}
我们现在删除后的表格中添加2条数据。分别是姓名“Rose”年龄“33”和姓名“Jake”年龄“45”两条数据。然后重新连接数据库并点击“查询数据”按钮,得到如下结果:
同时我们也可以使用SQLiteStudio直接产看数据库的内容,具体如下:
两种方式查询到的结果是一样的,说明我们的操作是正确的。
在这一篇中我们尝试了使用QT操作SQLite数据库,增、删、改、查以及创建等都可很好的实现。