应用场景:
关于登陆记住密码模块逻辑分析
这里演示用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数据库
这里展示的效果如下: