当前位置:   article > 正文

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

qdebug()<

目录

一、简介

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()打开或创建数据库

函数原型:

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

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

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

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

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

函数原型:

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

参数一:sqlite3数据库指针

参数二:SQL语句

参数三:结果集

参数四:查询结果的行数

参数五:查询结果的列数

参数六:错误报告

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

3、sqlite3_exec()执行SQL语句

函数原型:

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

参数一:sqlite3数据库指针

参数二:SQL语句

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

参数四:可以用0传参

参数五:错误报告

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

4、sqlite3_close()关闭数据库

函数原型

int sqlite3_close(sqlite3 *);

三、建库

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

  1. dataBase::dataBase(char *dataBaseName)
  2. {
  3. //appDataBase数据类型为sqlite3 *
  4. int ret = sqlite3_open(dataBaseName,&appDataBase);//数据库不存在自动创建
  5. if(ret)
  6. {
  7. qDebug()<<"Can't open DataBase";
  8. qDebug()<<sqlite3_errmsg(appDataBase);//打印错误报告
  9. exit(0);
  10. }
  11. else
  12. {
  13. qDebug()<<"Open"<<dataBaseName<<"successfully!";
  14. }
  15. }

四、建表

创建一个简单的用户表。

  1. void dataBase::createUserTable(char *tableName)
  2. {
  3. char *zErrMsg = 0;
  4. QString createTablesql=QString("CREATE TABLE if not exists %1(\
  5. userID integer primary key autoincrement,\
  6. userName varchar(255),\
  7. userPasswd varchar(255),\
  8. registerTime varchar(255)\
  9. );").arg(tableName);
  10. int rc=sqlite3_exec(PdataBase->appDataBase, createTablesql.toStdString().c_str(), nullptr, 0, &zErrMsg);
  11. if( rc != SQLITE_OK )
  12. {
  13. qDebug()<<zErrMsg;
  14. qDebug()<<createTablesql;
  15. }
  16. else
  17. {
  18. qDebug()<<tableName<<"table created successfully!";
  19. }
  20. }

五、封装一个getData()函数

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

  1. int dataBase::getData(const char *sql, char **&result, int &row, int &col)
  2. {
  3. char *errmsg = 0;
  4. int ret = sqlite3_get_table(PdataBase->appDataBase,sql,&result,&row,&col,&errmsg);
  5. if(ret != SQLITE_OK)
  6. {
  7. qDebug()<<sqlite3_errmsg(PdataBase->appDataBase);
  8. qDebug()<<sqlite3_errcode(PdataBase->appDataBase);
  9. }
  10. return 0;
  11. }

六、全部代码

1.头文件(.h)

  1. #ifndef DATABASE_H
  2. #define DATABASE_H
  3. #include "sqlite3.h"
  4. class dataBase
  5. {
  6. public:
  7. static dataBase *getDataBase(char *dataBaseName);//静态获取类对象指针的方法
  8. static void createUserTable(char *tableName);//建表
  9. static int getData(const char *sql,char **&result,int &row,int &col);
  10. sqlite3 *getAppDataBase();
  11. private:
  12. dataBase();
  13. dataBase(char *dataBaseName);
  14. ~dataBase();
  15. static dataBase *PdataBase;//类对象指针
  16. sqlite3 *appDataBase;//数据库指针
  17. };
  18. #endif // DATABASE_H

2.cpp文件

  1. #include "database.h"
  2. #include <QDebug>
  3. #include <QString>
  4. dataBase *dataBase::PdataBase = nullptr;
  5. dataBase *dataBase::getDataBase(char *dataBaseName)
  6. {
  7. if(dataBase::PdataBase == nullptr)
  8. {
  9. dataBase::PdataBase = new dataBase(dataBaseName);
  10. }
  11. return dataBase::PdataBase;
  12. }
  13. //创建用户表
  14. void dataBase::createUserTable(char *tableName)
  15. {
  16. char *zErrMsg = 0;
  17. QString createTablesql=QString("CREATE TABLE if not exists %1(\
  18. userID integer primary key autoincrement,\
  19. userName varchar(255),\
  20. userPasswd varchar(255),\
  21. registerTime varchar(255)\
  22. );").arg(tableName);
  23. int rc=sqlite3_exec(PdataBase->appDataBase, createTablesql.toStdString().c_str(), nullptr, 0, &zErrMsg);
  24. if( rc != SQLITE_OK )
  25. {
  26. qDebug()<<zErrMsg;
  27. qDebug()<<createTablesql;
  28. }
  29. else
  30. {
  31. qDebug()<<tableName<<"table created successfully!";
  32. }
  33. }
  34. //根据sql语句获取数据库数据
  35. int dataBase::getData(const char *sql, char **&result, int &row, int &col)
  36. {
  37. char *errmsg = 0;
  38. int ret = sqlite3_get_table(PdataBase->appDataBase,sql,&result,&row,&col,&errmsg);
  39. if(ret != SQLITE_OK)
  40. {
  41. qDebug()<<sqlite3_errmsg(PdataBase->appDataBase);
  42. qDebug()<<sqlite3_errcode(PdataBase->appDataBase);
  43. }
  44. return 0;
  45. }
  46. //获取数据库指针
  47. sqlite3 *dataBase::getAppDataBase()
  48. {
  49. return this->appDataBase;
  50. }
  51. //构造
  52. dataBase::dataBase()
  53. {
  54. }
  55. //重载构造
  56. dataBase::dataBase(char *dataBaseName)
  57. {
  58. int ret = sqlite3_open(dataBaseName,&appDataBase);//数据库不存在自动创建
  59. if(ret)
  60. {
  61. qDebug()<<"Can't open DataBase";
  62. qDebug()<<sqlite3_errmsg(appDataBase);
  63. exit(0);
  64. }
  65. else
  66. {
  67. qDebug()<<"Open"<<dataBaseName<<"successfully!";
  68. }
  69. }
  70. //析构函数,用于关闭数据库
  71. dataBase::~dataBase()
  72. {
  73. sqlite3_close(appDataBase);
  74. }

七、主函数测试

  1. #include <QApplication>
  2. #include <QDebug>
  3. #include "database.h"
  4. int main(int argc, char *argv[])
  5. {
  6. QApplication a(argc, argv);
  7. dataBase *data1 = dataBase::getDataBase("app.db");
  8. dataBase *data2 = dataBase::getDataBase("app.db");
  9. if(data1 == data2)//单例测试
  10. {
  11. qDebug()<<"这是同一个对象";
  12. }
  13. dataBase::createUserTable("user");//创建用户表
  14. return a.exec();
  15. }

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/490970
推荐阅读
相关标签