这一节,我讲一下数据库怎么在QT中使用。我这里是以单例模式使用。
代码书写
步骤1:
首先,我们在建立好一个工程后,我们要在pro文件中加上sql模块
步骤2:建立一个无继承关系的类CSDB,写入一下代码
CSDB.h文件
#include <QtSql>
#include <QSqlDatabase> //用于创建sql数据库
#include <QSqlError> //提示sql数据库操作时错误
#include <QSqlQuery> //提供数据库的 操作方法
#include <QDebug>
class CSDB
{
public:
~CSDB();
static CSDB *GetCSDB(const QString &filename);
bool CreateTable(QString TableName,QString Code); //建立表格的函数
private:
CSDB(const QString &filename); //打开一个 某个数据库
static CSDB * pcsdb; //数据库指针,这里设置成静态主要为了记录有没有建立好了数据库
QSqlDatabase database; //数据库
};
这里解析一下单例模式,我们在项目中就只需要一个数据库,所以每次我们要用到数据库的时候,不是说用一次建一个,而是建立一个数据库,下次要用的时候我就调用第一次建立的那个数据库。
注意:这里我的这个构造函数是放在私有之中,公共区只有一个获取数据库的方法。
步骤3、完善代码,CSDB.cpp文件
#include "csdb.h"
CSDB *CSDB::pcsdb = NULL; //静态变量pcsdb要在类外定义
//构造函数
CSDB::CSDB(const QString &filename) //传入数据库名称来获取数据库,注意要有后缀db
{
qDebug() << "CSDB Create" ;
//防止出现“可能会存在隐式内存泄漏”的警告
if(QSqlDatabase::contains("qt_sql_default_connection"))
{
database = QSqlDatabase::database("qt_sql_default_connection");
}
else
{
//选择数据库的类型并且创立
this->database = QSqlDatabase::addDatabase("QSQLITE");
}
//设置数据库的名字,注意要有后缀db
this->database.setDatabaseName(filename);
//打开数据库,打印是否打开成功
if(!this->database.open())
{
qDebug() << "数据库打开失败" ;
}
else
{
qDebug() << "数据库打开成功" ;
}
//玩家名字、分数
QString TableName_UserData = "UserData";
QString UserData_Code = "userName text ,scores integer";
//这里CreateTable函数是自己写的
this->CreateTable(TableName_UserData,UserData_Code);
}
//建立表格函数
bool CSDB::CreateTable(QString TableName,QString Code)
{
//这里使用的是QString 类当中的一个字符串拼接的函数,arg口号里面填写前面%1、%2处的地方
QString create_sql = QString("create table if not exists %1(%2);").arg(TableName).arg(Code);
//建立一个操作对象来执行数据库的代码
QSqlQuery SqlQuery;
//把代码放到执行器中
SqlQuery.prepare(create_sql);
//判断是否执行成功,并且打印是否成功
if(!SqlQuery.exec(create_sql))
{
qDebug()<<"失败";
return 0;
}
else
{
qDebug()<<"建表成功";
return 1;
}
}
//获取数据库
CSDB * CSDB::GetCSDB(const QString &filename)
{
//判断有没有数据库?如果不存在就创建,注意这里我的pcsdb是静态变量
if(NULL == pcsdb)
{
//创建数据库
pcsdb= new CSDB(filename);
}
//注意我这里返回的是一个数据库指针
return pcsdb;
}
//析构函数,关闭数据库
CSDB::~CSDB()
{
//关闭数据库
database.close();
qDebug() << "数据库以正常关闭" ;
}
步骤4、其他类对数据库的调用
//头文件
#include "csdb.h"
#include <QLabel> //标签
class Rank: public QWidget
{
Q_OBJECT
public:
explicit Rank(QWidget *parent = 0);
void RankShow();
//建立一些标签来显示数据库查询到的东西
QLabel *label_Num[10];
QLabel *label_Name[10];
QLabel *label_Scores[10];
private:
CSDB * my_csdb;
}
//cpp文件
Rank::Rank(QWidget *parent)
: QWidget(parent)
{
//打开数据
my_csdb = CSDB::GetCSDB("My_GameData.db");
//设置一下标签的位置
int i;
for(i = 0; i < 10; i++)
{
label_Num[i] = new QLabel(this);
label_Name[i] = new QLabel(this);
label_Scores[i] = new QLabel(this);
label_Num[i]->setGeometry(QRect(50, 180+i*40, 60, 21));
label_Name[i]->setGeometry(QRect(170, 180+i*40, 120, 21));
label_Scores[i]->setGeometry(QRect(360, 180+i*40, 60, 21));
label_Num[i]->setStyleSheet("QLabel{font:bold;color:rgb(94,200,255) ;font-size:18px;}");
label_Name[i]->setStyleSheet("QLabel{font:bold;color:rgb(94,200,255) ;font-size:18px;}");
label_Scores[i]->setStyleSheet("QLabel{font:bold;color:rgb(94,200,255) ;font-size:18px;}");
this->RankShow();
}
}
void Rank::RankShow()
{
//查询My_GameData数据库的UserData表格中降序的scores字段
QString insert_sql = "select * from UserData order by scores DESC;";
//建立SQL数据库的执行器
QSqlQuery sqlquery;
//用执行器执行代码,看是否能编译过去
if(!sqlquery.exec(insert_sql))
{
//编译过程出错,输出错误
qDebug() << "register fail" << sqlquery.lastError() ;
//return 0;
}
else
{
//RankNum来标记数据的序号,row来表示函数
int RankNum = 1;
int row = 0;
while(sqlquery.next()) //提取查询到的信息
{
if(row<=9)
{
label_Num[row]->setText(QString("%1").arg(RankNum));
label_Name[row]->setText(sqlquery.value(0).toString());
label_Scores[row]->setText(sqlquery.value(1).toString());
row++;
}
RankNum++; //计算总共有几条
}
}
}
相关思路
我在项目中使用数据库的话,一般是在一个程序开始的时候就打开数据库(就是说我在项目中只使用到一次CSDB::GetCSDB(“My_GameData.db”);),并没有说要用是的时候打开,不用就关闭,如果你在很多类当中都要用到数据,那么你随意delete数据库指针很容易造成内存泄漏!