目录
2、sqlite3_get_table()用于查询获取结果集
一、简介
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数据库,并且创建了一张用户表。
原创不易,转载请标明出处。