Sqlite3在C++中的常用知识点回顾

 

应用场景:

关于登陆记住密码模块逻辑分析
这里演示用sqlite3来进行登陆相关数据的存储
下面说的status的状态 指的是checkbox的状态

流程:

Step1 判断是否有表的存在,没有则创建之(这个通过函数 sqlite3_open )并且进入Step2,存在表则打开判断status的值

并且进入Step3
Step2 输入对应的值 进入Step2_1
Step2_1 判断Status的值 当值为1的时候进入Step2_2;值为0的时候 直接结束流程
Step2_2 进行数据的插入 更新status的数据为1 并且结束流程
Step3 status的值为1的时候 从db导入数据 填充登陆界面数据 进入Step4; status值为0的时候 输入数据 进入Step5
Step4 这里可以更新Status的值 如果不更新 则直接结束 如果更新Status变成0 更新数据库
Step5 直接结束流程

 

代码片段

首先打开数据库的操作,如果没有则创建新的数据库
代码片段如下:
    打开数据的核心函数:sqlite3_open
    函数原型 SQLITE_API int sqlite3_open(
                                  const char *filename,   /* Database filename (UTF-8) */
                                  sqlite3 **ppDb          /* OUT: SQLite db handle */
                                );

    这里可以通过f12自行查看
  

 int rc = sqlite3_open("dat.db", &m_db);    //这里的m_db的类型是 sqlite3 *
    if (0 != rc)
    {
        SOUI::SMessageBox(NULL, L"打开数据库失败", L"错误信息", MB_ICONERROR);
    }

判断表是否存在 如果不存在则创建表,如果存在则打开表 取出相应的数据
代码片段:
 

int tableNums = 0;
    char *zErrMsg = 0;
    std::string sql = "select count(*) from sqlite_master where type ='table' and name ='DATA'";
    rc = sqlite3_exec(m_db, sql.c_str(), &sqlite3_callback_func, &tableNums, &zErrMsg);

    if (0 == tableNums)        //表示不存在这个表
    {
        sql = "create table DATA(" \
            "STATUS INT PRIMARY KEY     NOT NULL," \
            "IPADDRESS        CHAR(50)," \
            "USERNAME         CHAR(50)," \
            "PASSWORD         CHAR(50));";

        rc = sqlite3_exec(m_db, sql.c_str(), NULL, 0, &zErrMsg);
        if (rc != SQLITE_OK)
        {
            SOUI::SMessageBox(NULL, SOUI::S_CA2T(zErrMsg), L"提示", MB_ICONERROR);
        }
    }
    else
    {//如果存在则打开取出数据
        sql = "select * from DATA";
        rc = sqlite3_exec(m_db, sql.c_str(), &FuncValueCallback, &m_data, &zErrMsg);
        if (rc != SQLITE_OK)
        {
            SOUI::SMessageBox(NULL, SOUI::S_CA2T(zErrMsg), L"提示", MB_ICONERROR);
        }
        
        //根据取到的status的值 来判断checkbox的状态
        if (m_data.status == 1)
        {
            m_bCheckStatus = TRUE;    //表示checkbox被选中
        }
    }

回调函数:FuncValueCallback 和 回调函数 sqlite3_callback_func

//回调 取出数据库中的值
//pHandle传入参数的地址(通过这个值来返回数据)	iRet:列数    szSrc:值  	szDst:键
int FuncValueCallback(void* pHandle, int iRet, char** szSrc, char** szDst)
{
	if (pHandle != nullptr)
	{
		sql_data* pRes = (sql_data*)pHandle;
		pRes->status = atoi(szSrc[0]);
		pRes->ipAddress = szSrc[1];
		pRes->userName = szSrc[2];
		pRes->passWord = szSrc[3];
	}
	return 0;
}

//回调判断有几个同名的表
int sqlite3_callback_func(void* pHandle, int iRet, char** szSrc, char** szDst)
{
	if (1 == iRet)
	{
		int iTableExist = atoi(*(szSrc));
		if (pHandle != nullptr)
		{
			int* pRes = (int*)pHandle;
			*pRes = iTableExist;
		}
	}

	return 0;
}

知识补充:sqlite3_exec这个函数 用来执行sql语句 
函数原型如下:
SQLITE_API 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 */
);

插入数据代码片段:

int status = 0;
string url = "192.168.0.1";
string name = "JamesWu9527";
string password = "123456";
sql = "insert into DATA(STATUS,IPADDRESS,USERNAME,PASSWORD) values(" + std::to_string(status) + ",'" + url + "','" + name + "','" + password + "' ); ";        
rc = sqlite3_exec(m_db, sql.c_str(), NULL, 0, &zErrMsg);
if (rc != SQLITE_OK)    //错误提示
        {
            SOUI::SMessageBox(NULL, SOUI::S_CA2T(zErrMsg), L"提示", MB_ICONERROR);
        }

//更新数据代码片段

std::string sql = "update data set STATUS = 0";        //将STATUS这个键对应的值更新为0
int rc = sqlite3_exec(m_db, sql.c_str(), NULL, 0, &zErrMsg);

//删除数据代码片段

std::string sql = "delete from data";        //删除data的表
int rc = sqlite3_exec(m_db, sql.c_str(), NULL, 0, &zErrMsg);

sqldata的数据结构

struct sql_data
{
    int status;
    std::string ipAddress;
    std::string userName;
    std::string passWord;

    sql_data()
    {
        status = 0;
        ipAddress = "";
        userName = "";
        passWord = "";
    }
};

使用SQLiteStudio.exe可以查看对应的db数据库

这里展示的效果如下:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值