Qt结合sqlite3数据库实现数据库单例(懒汉式)及建库建表

目录

一、简介

1、为什么数据库要用单例模式?

2、单例模式(懒汉式)实现步骤

二、相关函数

1、sqlite3_open()打开或创建数据库

2、sqlite3_get_table()用于查询获取结果集

3、sqlite3_exec()执行SQL语句

4、sqlite3_close()关闭数据库

三、建库

四、建表

五、封装一个getData()函数

六、全部代码

1.头文件(.h)

2.cpp文件

七、主函数测试

一、简介

1、为什么数据库要用单例模式?

1.单例只保留一个对象,可以减少系统资源开销。

2.提高创建速度,每次都获取已经存在的对象,因此提高创建速度,且全局共享对象。

3.单例在系统中只存在一个对象实例,因此任何地方使用此对象都是同一个对象,这样就避免多实例化对象导致重复打开数据库。

2、单例模式(懒汉式)实现步骤

1.把构造私有化(保证只能自己实例化对象)。

2.定义一个私有的静态类对象指针(初始化为NULL)。

3.定义一个共有的静态获取类对象指针访问接口。

        只能实例化一个对象,比如窗口管理器。在一个应用程序中,一个类有且只有一个实例,并提供一个访问它的全局访问点。只有在第一次调用静态方法的时候才进行内存分配。如果整个程序不调用该静态方法,则不会分配内存,所以也叫“懒汉”模式。

二、相关函数

1、sqlite3_open()打开或创建数据库

函数原型:

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

参数一:数据库名称(xxx.db)

参数二:sqlite *类型的数据库指针

返回值:返回值为1则数据库打开或创建失败,否则成功。

2、sqlite3_get_table()用于查询获取结果集

函数原型:

int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);

参数一:sqlite3数据库指针

参数二:SQL语句

参数三:结果集

参数四:查询结果的行数

参数五:查询结果的列数

参数六:错误报告

返回值:返回值为0则执行语句成功,否则失败。

3、sqlite3_exec()执行SQL语句

函数原型:

int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

参数一:sqlite3数据库指针

参数二:SQL语句

参数三:回调函数,可以用NULL

参数四:可以用0传参

参数五:错误报告

返回值:返回值为0则执行语句成功,否则失败。

4、sqlite3_close()关闭数据库

函数原型

int sqlite3_close(sqlite3 *);

三、建库

通过重载构造函数来创建或打开数据库

dataBase::dataBase(char *dataBaseName)
{
    //appDataBase数据类型为sqlite3 *
    int ret = sqlite3_open(dataBaseName,&appDataBase);//数据库不存在自动创建
    if(ret)
    {
        qDebug()<<"Can't open DataBase";
        qDebug()<<sqlite3_errmsg(appDataBase);//打印错误报告
        exit(0);
    }
    else
    {
        qDebug()<<"Open"<<dataBaseName<<"successfully!";
    }
}

四、建表

创建一个简单的用户表。

void dataBase::createUserTable(char *tableName)
{
    char *zErrMsg = 0;
    QString createTablesql=QString("CREATE TABLE if not exists %1(\
                                   userID integer  primary key autoincrement,\
                                   userName varchar(255),\
                                   userPasswd varchar(255),\
                                   registerTime varchar(255)\
                                   );").arg(tableName);
    int  rc=sqlite3_exec(PdataBase->appDataBase, createTablesql.toStdString().c_str(), nullptr, 0, &zErrMsg);
    if( rc != SQLITE_OK )
    {
        qDebug()<<zErrMsg;
        qDebug()<<createTablesql;
    }
    else
    {
        qDebug()<<tableName<<"table created successfully!";
    }
}

五、封装一个getData()函数

该函数主要用于后续进行查询,appDataBase数据类型为sqlite *。

int dataBase::getData(const char *sql, char **&result, int &row, int &col)
{
    char *errmsg = 0;
    int ret = sqlite3_get_table(PdataBase->appDataBase,sql,&result,&row,&col,&errmsg);
    if(ret != SQLITE_OK)
    {
       qDebug()<<sqlite3_errmsg(PdataBase->appDataBase);
       qDebug()<<sqlite3_errcode(PdataBase->appDataBase);
    }
    return 0;
}

六、全部代码

1.头文件(.h)

#ifndef DATABASE_H
#define DATABASE_H

#include "sqlite3.h"

class dataBase
{
public:
    static dataBase *getDataBase(char *dataBaseName);//静态获取类对象指针的方法

    static void createUserTable(char *tableName);//建表

    static int getData(const char *sql,char **&result,int &row,int &col);

    sqlite3 *getAppDataBase();

private:
    dataBase();
    dataBase(char *dataBaseName);
    ~dataBase();

    static dataBase *PdataBase;//类对象指针

    sqlite3 *appDataBase;//数据库指针
};

#endif // DATABASE_H

2.cpp文件

#include "database.h"
#include <QDebug>
#include <QString>

dataBase *dataBase::PdataBase = nullptr;

dataBase *dataBase::getDataBase(char *dataBaseName)
{
    if(dataBase::PdataBase == nullptr)
    {
        dataBase::PdataBase = new dataBase(dataBaseName);
    }
    return dataBase::PdataBase;
}

//创建用户表
void dataBase::createUserTable(char *tableName)
{
    char *zErrMsg = 0;
    QString createTablesql=QString("CREATE TABLE if not exists %1(\
                                   userID integer  primary key autoincrement,\
                                   userName varchar(255),\
                                   userPasswd varchar(255),\
                                   registerTime varchar(255)\
                                   );").arg(tableName);
    int  rc=sqlite3_exec(PdataBase->appDataBase, createTablesql.toStdString().c_str(), nullptr, 0, &zErrMsg);
    if( rc != SQLITE_OK )
    {
        qDebug()<<zErrMsg;
        qDebug()<<createTablesql;
    }
    else
    {
        qDebug()<<tableName<<"table created successfully!";
    }
}


//根据sql语句获取数据库数据
int dataBase::getData(const char *sql, char **&result, int &row, int &col)
{
    char *errmsg = 0;
    int ret = sqlite3_get_table(PdataBase->appDataBase,sql,&result,&row,&col,&errmsg);
    if(ret != SQLITE_OK)
    {
       qDebug()<<sqlite3_errmsg(PdataBase->appDataBase);
       qDebug()<<sqlite3_errcode(PdataBase->appDataBase);
    }
    return 0;
}

//获取数据库指针
sqlite3 *dataBase::getAppDataBase()
{
    return this->appDataBase;
}

//构造
dataBase::dataBase()
{

}


//重载构造
dataBase::dataBase(char *dataBaseName)
{
    int ret = sqlite3_open(dataBaseName,&appDataBase);//数据库不存在自动创建
    if(ret)
    {
        qDebug()<<"Can't open DataBase";
        qDebug()<<sqlite3_errmsg(appDataBase);
        exit(0);
    }
    else
    {
        qDebug()<<"Open"<<dataBaseName<<"successfully!";
    }
}

//析构函数,用于关闭数据库
dataBase::~dataBase()
{
    sqlite3_close(appDataBase);
}

七、主函数测试

#include <QApplication>
#include <QDebug>
#include "database.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    dataBase *data1 = dataBase::getDataBase("app.db");
    dataBase *data2 = dataBase::getDataBase("app.db");

    if(data1 == data2)//单例测试
    {
        qDebug()<<"这是同一个对象";
    }

    dataBase::createUserTable("user");//创建用户表

    return a.exec();
}

打印输出结果如下,会在工程目录底下生成一个app.db数据库,并且创建了一张用户表。

原创不易,转载请标明出处。

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

似末

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值