Sqlite 数据库作为 Qt 项目开发中经常使用的一个轻量级的数据库,可以说是兼容性相对比较好的数据库之一(Sqlite就像Qt的亲儿子,如同微软兼容Access数据库一样)。Qt5 以上版本可以直接使用(Qt自带驱动),是一个轻量级的数据库,概况起来具有以下优点:
1、引入SQL模块
在Qt项目文件(.pro文件)中,加入SQL模块:
QT += sql
2、引用头文件
在需要使用SQL的类定义中,引用相关头文件。例如:
#include
#include
#include
1、建立数据库
QSqlDatabase database;
if (QSqlDatabase::contains("qt_sql_default_connection"))
{
database = QSqlDatabase::database("qt_sql_default_connection");
}
else
{
// 建立和SQlite数据库的连接
database = QSqlDatabase::addDatabase("QSQLITE");
// 设置数据库文件的名字
database.setDatabaseName("MyDataBase.db");
}
database = QSqlDatabase::addDatabase("QSQLITE", "my_sql_connection);
这个时候,如果在另一个地方需要判断my_sql_connection连接是否存在,就应该使用 if (QSqlDatabase::contains(“my_sql_connection”))。
2、打开数据库
使用 open() 打开数据库,并判断是否成功。注意,在第一步检查连接是否存在时,如果连接存在,则在返回这个连接的时候,会默认将数据库打开。
if (!database.open())
{
qDebug() << "Error: Failed to connect database." << database.lastError();
}
else
{
// do something
}
如果打开数据库成功,则进入else分支。对数据库的操作都需要在else分支中进行。
3、关闭数据库
数据库操作完成后,最好关闭。
database.close();
4、操作数据库
对数据库进行操作需要用到 QSqlQuery 类,操作前必须定义一个对象。下面举例说明操作方法。操作需要使用 SQL 语句,本文中的几个例子会使用几个常用的语句。
例1:创建表格
创建一个名为student的表格,表格包含三列,第一列是id,第二列是名字,第三列是年龄。
// 用于执行sql语句的对象
QSqlQuery sqlQuery;
// 构建创建数据库的sql语句字符串
QString createSql = QString("CREATE TABLE student (\
id INT PRIMARY KEY NOT NULL,\
name TEXT NOT NULL,\
age INT NOT NULL)");
sqlQuery.prepare(createSql);
// 执行sql语句
if(!sqlQuery.exec())
{
qDebug() << "Error: Fail to create table. " << sqlQuery.lastError();
}
else
{ qDebug() << "Table created!";
}
sql_query.exec("CREATE TABLE student (ID INT PRIMARY KEY NOT NULL, ...)");
例2:插入单行数据
在刚才创建的表格中,插入单行数据。
// 方法一:使用 bindValue 函数插入单行数据
QSqlQuery sqlQuery;
sqlQuery.prepare("INSERT INTO student VALUES(:id,:name,:age)");
sqlQuery.bindValue(":id", max_id + 1);
sqlQuery.bindValue(":name", "Wang");
sqlQuery.bindValue(":age", 25);
if(!sqlQuery.exec())
{
qDebug() << "Error: Fail to insert data. " << sqlQuery.lastError();
}
else
{
// do something
}
// 方法二:使用 addBindValue 函数插入单行数据
QSqlQuery sqlQuery;
sqlQuery.prepare("INSERT INTO student VALUES(?, ?, ?)");
sqlQuery.addBindValue(max_id + 1);
sqlQuery.addBindValue("Wang");
sqlQuery.addBindValue(25);
if(!sqlQuery.exec())
{
qDebug() << "Error: Fail to insert data. " << sqlQuery.lastError();
}
else
{
// do something
}
// 方法三:直接写出完整语句
if(!sql_query.exec("INSERT INTO student VALUES(3, \"Li\", 23)"))
{
qDebug() << "Error: Fail to insert data. " << sqlQuery.lastError();
}
else
{
// do something
}
例3:查询全部数据
QSqlQuery sqlQuery;
sqlQuery.exec("SELECT * FROM student");
if(!sqlQuery.exec())
{
qDebug() << "Error: Fail to query table. " << sqlQuery.lastError();
}
else
{
while(sqlQuery.next())
{
int id = sqlQuery.value(0).toInt();
QString name = sqlQuery.value(1).toString();
int age = sqlQuery.value(2).toInt();
qDebug()<<QString("id:%1 name:%2 age:%3").arg(id).arg(name).arg(age);
}
}
例4:更新数据(修改数据)
QSqlQuery sqlQuery;
sqlQuery.prepare("UPDATE student SET name=?,age=? WHERE id=?");
sqlQuery.addBindValue(name);
sqlQuery.addBindValue(age);
sqlQuery.addBindValue(id);
if(!sqlQuery.exec())
{
qDebug() << sqlQuery.lastError();
}
else
{
qDebug() << "updated data success!";
}
上面只是列举了几个常用的SQL语句例子,下面贴出一个完整示例程序:
SqliteOperator.h
#ifndef SQLITEOPERATOR_H
#define SQLITEOPERATOR_H
#include
#include
#include
#include
typedef struct
{
int id;
QString name;
int age;
}w2dba;
class SqliteOperator
{
public:
SqliteOperator();
// 打开数据库
bool openDb(void);
// 创建数据表
void createTable(void);
// 判断数据表是否存在
bool isTableExist(QString& tableName);
// 查询全部数据
void queryTable();
// 插入数据
void singleInsertData(w2dba &singleData); // 插入单条数据
void moreInsertData(QList<w2dba> &moreData); // 插入多条数据
// 修改数据
void modifyData(int id, QString name, int age);
// 删除数据
void deleteData(int id);
//删除数据表
void deleteTable(QString& tableName);
// 关闭数据库
void closeDb(void);
private:
QSqlDatabase database;// 用于建立和数据库的连接
};
#endif // SQLITEOPERATOR_H
SqliteOperator.cpp
#include "sqliteoperator.h"
// 构造函数中初始化数据库对象,并建立数据库
SqliteOperator::SqliteOperator()
{
if (QSqlDatabase::contains("qt_sql_default_connection"))
{
database = QSqlDatabase::database("qt_sql_default_connection");
}
else
{
// 建立和SQlite数据库的连接
database = QSqlDatabase::addDatabase("QSQLITE");
// 设置数据库文件的名字
database.setDatabaseName("MyDataBase.db");
}
}
// 打开数据库
bool SqliteOperator::openDb()
{
if (!database.open())
{
qDebug() << "Error: Failed to connect database." << database.lastError();
}
else
{
// do something
}
return true;
}
// 创建数据表
void SqliteOperator::createTable()
{
// 用于执行sql语句的对象
QSqlQuery sqlQuery;
// 构建创建数据库的sql语句字符串
QString createSql = QString("CREATE TABLE student (\
id INT PRIMARY KEY NOT NULL,\
name TEXT NOT NULL,\
age INT NOT NULL)");
sqlQuery.prepare(createSql);
// 执行sql语句
if(!sqlQuery.exec())
{
qDebug() << "Error: Fail to create table. " << sqlQuery.lastError();
}
else
{
qDebug() << "Table created!";
}
}
// 判断数据库中某个数据表是否存在
bool SqliteOperator::isTableExist(QString& tableName)
{
QSqlDatabase database = QSqlDatabase::database();
if(database.tables().contains(tableName))
{
return true;
}
return false;
}
// 查询全部数据
void SqliteOperator::queryTable()
{
QSqlQuery sqlQuery;
sqlQuery.exec("SELECT * FROM student");
if(!sqlQuery.exec())
{
qDebug() << "Error: Fail to query table. " << sqlQuery.lastError();
}
else
{
while(sqlQuery.next())
{
int id = sqlQuery.value(0).toInt();
QString name = sqlQuery.value(1).toString();
int age = sqlQuery.value(2).toInt();
qDebug()<<QString("id:%1 name:%2 age:%3").arg(id).arg(name).arg(age);
}
}
}
// 插入单条数据
void SqliteOperator::singleInsertData(w2dba &singledb)
{
QSqlQuery sqlQuery;
sqlQuery.prepare("INSERT INTO student VALUES(:id,:name,:age)");
sqlQuery.bindValue(":id", singledb.id);
sqlQuery.bindValue(":name", singledb.name);
sqlQuery.bindValue(":age", singledb.age);
if(!sqlQuery.exec())
{
qDebug() << "Error: Fail to insert data. " << sqlQuery.lastError();
}
else
{
// do something
}
}
// 插入多条数据
void SqliteOperator::moreInsertData(QList<w2dba>& moredb)
{
// 进行多个数据的插入时,可以利用绑定进行批处理
QSqlQuery sqlQuery;
sqlQuery.prepare("INSERT INTO student VALUES(?,?,?)");
QVariantList idList,nameList,ageList;
for(int i=0; i< moredb.size(); i++)
{
idList << moredb.at(i).id;
nameList << moredb.at(i).name;
ageList << moredb.at(i).age;
}
sqlQuery.addBindValue(idList);
sqlQuery.addBindValue(nameList);
sqlQuery.addBindValue(ageList);
if (!sqlQuery.execBatch()) // 进行批处理,如果出错就输出错误
{
qDebug() << sqlQuery.lastError();
}
}
// 修改数据
void SqliteOperator::modifyData(int id, QString name, int age)
{
QSqlQuery sqlQuery;
sqlQuery.prepare("UPDATE student SET name=?,age=? WHERE id=?");
sqlQuery.addBindValue(name);
sqlQuery.addBindValue(age);
sqlQuery.addBindValue(id);
if(!sqlQuery.exec())
{
qDebug() << sqlQuery.lastError();
}
else
{
qDebug() << "updated data success!";
}
}
// 删除数据
void SqliteOperator::deleteData(int id)
{
QSqlQuery sqlQuery;
sqlQuery.exec(QString("DELETE FROM student WHERE id = %1").arg(id));
if(!sqlQuery.exec())
{
qDebug()<<sqlQuery.lastError();
}
else
{
qDebug()<<"deleted data success!";
}
}
//删除数据表
void SqliteOperator::deleteTable(QString& tableName)
{
QSqlQuery sqlQuery;
sqlQuery.exec(QString("DROP TABLE %1").arg(tableName));
if(sqlQuery.exec())
{
qDebug() << sqlQuery.lastError();
}
else
{
qDebug() << "deleted table success";
}
}
void SqliteOperator::closeDb(void)
{
database.close();
}
main.cpp
#include
#include "sqliteoperator.h"
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//创建并打开SQLite数据库
SqliteOperator sqlTest;
sqlTest.openDb();
// 创建数据表
sqlTest.createTable();
// 判断数据表是否存在
QString str1 = QString("student");
qDebug() << "isTabelExist:" <<sqlTest.isTableExist(str1);
// 插入单条数据
w2dba w2dbaTest1 = {1, "zhangSan", 24};
w2dba w2dbaTest2 = {2, "lisi", 28};
sqlTest.singleInsertData(w2dbaTest1);
sqlTest.singleInsertData(w2dbaTest2);
// 插入多条数据
QList<w2dba> list;
w2dba w2dbaTest3 = {3, "liwu", 26};
w2dba w2dbaTest4 = {4, "niuer", 27};
list.append(w2dbaTest3);
list.append(w2dbaTest4);
sqlTest.moreInsertData(list);
// 查询全部数据
sqlTest.queryTable();
qDebug() << endl;
// 修改数据
sqlTest.modifyData(2, "modify", 10);
// 查询全部数据
sqlTest.queryTable();
qDebug() << endl;
// 删除数据
sqlTest.deleteData(2);
// 查询全部数据
sqlTest.queryTable();
qDebug() << endl;
// 删除数据表
QString str2 = QString("student");
sqlTest.deleteTable(str2);
//关闭数据库
sqlTest.closeDb();
return a.exec();
}