赞
踩
目录
2、sqlite3_get_table()用于查询获取结果集
1.单例只保留一个对象,可以减少系统资源开销。
2.提高创建速度,每次都获取已经存在的对象,因此提高创建速度,且全局共享对象。
3.单例在系统中只存在一个对象实例,因此任何地方使用此对象都是同一个对象,这样就避免多实例化对象导致重复打开数据库。
1.把构造私有化(保证只能自己实例化对象)。
2.定义一个私有的静态类对象指针(初始化为NULL)。
3.定义一个共有的静态获取类对象指针访问接口。
只能实例化一个对象,比如窗口管理器。在一个应用程序中,一个类有且只有一个实例,并提供一个访问它的全局访问点。只有在第一次调用静态方法的时候才进行内存分配。如果整个程序不调用该静态方法,则不会分配内存,所以也叫“懒汉”模式。
函数原型:
- int sqlite3_open(
- const char *filename, /* Database filename (UTF-8) */
- sqlite3 **ppDb /* OUT: SQLite db handle */
- );
参数一:数据库名称(xxx.db)
参数二:sqlite *类型的数据库指针
返回值:返回值为1则数据库打开或创建失败,否则成功。
函数原型:
- 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则执行语句成功,否则失败。
函数原型:
- 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则执行语句成功,否则失败。
函数原型
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!";
- }
- }
该函数主要用于后续进行查询,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;
- }
- #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
- #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数据库,并且创建了一张用户表。
原创不易,转载请标明出处。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。