前端之家收集整理的这篇文章主要介绍了
sqlite3 基本功能操作,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
<pre name="code" class="cpp">//学了两天sqlite数据库的用法,总结下。
/*打开一个数据库,如果已经存在直接打开,否则会创建一个*/
1 int sqlite3_open(
const char *filename,/*这个是数据库的文件名*/
sqlite3 **ppDb/*要带回的数据库句柄*/
);
/*关闭句柄*/
2)int sqlite3_close(
sqlite3 *pDb /*关闭句柄*/
);
/*执行sql语句,并对结果的每一项都调用回调函数(如果回调函数存在的话)*/
3)int sqlite3_exec(
sqlite3 * pDb,/*数据库句柄*/
const char *sql,/*sql 语句*/
int (*callback)(void *,int,char **,char **),/*回调函数*/
void *argument,/*回调函数的参数*/
char **errmsg/*错误信息*/
);
回调函数说明比如:
int func(
void *argument,/*这是sqlite3_exec的第4个参数*/
int colum,/*数据库的表项数目*/
char **column_value,/*数据库表项的值构成的数据*/
char ** column_name,/*数据库表项名称*/
)
/*将sql语句翻译成能被sqlite解释器执行的字节码*/
4)int sqlite3_prepare_v2(
sqlite3 *db,/*数据库文件句柄*/
const char *zsql,/*数据库命令*/
int nByte,/*数据库命令的长度 (如果为负值,则自动计算长度)*/
sqlite3_stmt **ppStmt,/*这个是特别需要的结构体 解释后的信息存储于此*/
const char **pzTail/*这个指针指向没有被翻译到的sql语句的地方*/
);
/*个人理解:这个函数时配合sqlite3_prepare_v2执行的语句,执行由sqlite3_prepare_*系列函数生成的结果,且执行是一条一条的执行的,就是说执行一次返回一个结果,如果
返回为 sqlITE3_ROW 则说明该次执行结果有效,直到返回sqlITE3_DOWN才说明遍历完成 */
5)int sqlite3_step(
sqlite3_stmt *pStmt /*由sqlite3_prepare_v2给出的参数*/
);
/*sqlite3_column_系列函数都是针对sqlite3_step执行后生成的结果的,对该结果进行处理*/
6)
/*返回一条结果的列数*/
int sqlite3_column_count(
sqlite3_stmt *pStmt
);
/*返回第N个列的名称*/
const char *sqlite3_column_name(
sqlite3_stmt *pStmt,int N
)
/*返回第iCol列所占的字节数*/
int sqlite3_column_bytes(sqlite3_stmt*,int iCol);
/*返回第iCol列的那个整数(前提是你已经知道是整数)*/
int sqlite3_column_int(sqlite3_stmt*,int iCol);
/*返回第iCol列的那个浮点数(前提是你已经知道是浮点数)*/
double sqlite3_column_double(sqlite3_stmt*,int iCol);
/*通用,返回第iCol的数据空间的指针*/
const unsigned char *sqlite3_column_text(sqlite3_stmt*,int iCol);
/*
说明:一般指令的执行就是如上的顺序:
sqlite3_prepare_v2();
sqlite3_step();
sqilte3_column_*
*/
7)
/*注意释放结构体*/
sqlite3_finalize(sqlite3_stmt *pstat)
//-----------------------------------------------------------
如上即可完成基本的 sqllite数据库的操作。
执行sql语句时,如上提供了两种:
//方案一
sqlite3_exec()
//方案二
sqlite3_prepare_v2()
sqlite3_step()
sqlite3_column_*
sqlite3_finalize()
选择方案:
如果一条语句只有一个返回结果就用sqlite3_exec()
例如:
drop table tablename ;//删除表
insert table ... //插入表
反之如果一个sql语句可能有多个结果使用方案二比较方便
例如:
select * from tablename where name ='ok' ;//可能有多个ok
理由:
方案二能很方便对每一个结果进行处理。当然方案一也是可以的,但是得需要使用回调函数。
下面举例两种编程
//sqlite3_exec 每一条执行结果都会调用该函数进行处理
int func (void*myarg,int colum,char** column_value,char** column_name)
{
const unsigned char * value = column_value[0];
const unsigned char *msg = column_value[1];
...
return 0;
}
ok1()
{
sprintf(sql,"select * from table1 where sn = '123456789012' ;");
int column;
rc = sqlite3_exec(m_db,sql,func,(void *)1,&strmsg);
if(rc != sqlITE_OK){
sqlite3_free(strmsg);
}
}
ok2()
{
sqlite3_stmt *pStmt;
sqlite3_prepare_v2(m_db,-1,&pStmt,NULL);
while((rc = sqlite3_step(pStmt)) == sqlITE_ROW){
int i = sqlite3_column_count(pStmt);
const unsigned char * value = sqlite3_column_text(pStmt,0);
const unsigned char *msg = sqlite3_column_text(pStmt,1);
const unsigned char *ok = sqlite3_column_text(pStmt,2);
}
sqlite3_finalize(pStmt);
}
原文链接:https://www.f2er.com/sqlite/200525.html