QT——入门之数据库(2)

这一节,我讲一下数据库怎么在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数据库指针很容易造成内存泄漏!

猜你喜欢

转载自blog.csdn.net/l1206715877/article/details/106263956