数据库学习之————sqlite3数据库常用函数

1、打开数据库: 
API函数: 

int sqlite3_open( 

const char *filename, /* 数据库文件路径(UTF-8编码) */ 

sqlite3 **ppDb /* 输出: SQLite 数据库句柄 */ 

); 

int sqlite3_open16( 

const void *filename, /* 数据库文件路径(UTF-16) */ 

sqlite3 **ppDb /* 输出: SQLite 数据库句柄 */ 

); 

如果调用成功会返回SQLITE_OK,否则返回错误码。

2、构造SQL语句

这里就不多说了,这和SQLite本身无关,可以根据需要使用适当的方法构造即可,注意传给SQLite函数的时候,字符串编码要记得转换为UTF8/UTF16  

3、执行SQL语句。 
在SQLite中执行SQL语句比较简单的方法是调用函数: 

int sqlite3_exec(

sqlite3*, /* 打开的数据库句柄 */ 

const char *sql, /* UTF8编码的SQL语句 */ 

int (*callback)(void*,int,char**,char**), /* 回调函数,对于SELECT语句返回的结果处理在回调函数中进行 */

void *, /* 传递给回调函数的参数 */ 

char **errmsg /* 相关错误信息 */ 

);  

其实sqlite3_exec只是封装了sqlite3_prepare、sqite3_step(即SQL中的预编译技术)的,
主要目的是为使用者提供方便,笔者个人觉得使用后者会更加好一点,
这里先做一下总结:  

int sqlite3_prepare( 

sqlite3 *db, /* 打开的数据库句柄 */ 

const char *zSql, /* UTF8编码的SQL语句,可以参数化 */ 

intnByte, /* SQL语句的字节长度,可以传递-1,即字符串以\0结尾 */ 

sqlite3_stmt **ppStmt, /* 输出:预编译之后的SQL语句句柄 */ 

const char **pzTail /* 输出: 指向zSql缓冲区中跳过有效SQL字符串的第一个字节 */ 

);  

int sqlite3_prepare_v2( 

sqlite3 *db, /* 打开的数据库句柄 */ 

const char *zSql, /* UTF8编码的SQL语句,可以参数化 */ 

int nByte, /* SQL语句的字节长度,可以传递-1,即字符串以宽字符\0结尾 */ 

sqlite3_stmt **ppStmt, /* 输出: 预编译之后的SQL语句句柄 */ 

const char **pzTail/* 输出: 指向zSql缓冲区中跳过有效SQL字符串的第一个字节 */

 );  

int sqlite3_prepare16( 

sqlite3 *db, /* 打开的数据库句柄 */ 

const void *zSql, /* UTF16编码的SQL语句,可以参数化 */ 

int nByte,/* SQL语句的字节长度,可以传递-1,即字符串以宽字符\0结尾 */

sqlite3_stmt **ppStmt, /* 输出: 预编译之后的SQL语句句柄 */ 

const void **pzTail /* 输出: 指向zSql缓冲区中跳过有效SQL字符串的第一个字节 */

 );  

int sqlite3_prepare16_v2( 

sqlite3 *db, /* 打开的数据库句柄 */ 

const void *zSql,/* UTF16编码的SQL语句,可以参数化 */ 

int nByte, /* SQL语句的字节长度,可以传递-1,即字符串以宽字符\0结尾 */

sqlite3_stmt **ppStmt, /* 输出: 预编译之后的SQL语句句柄 */ 

const void **pzTail /* 输出: 指向zSql缓冲区中跳过有效SQL字符串的第一个字节 */ 

);  

其中带参数的SQL语句可以这样定义参数: 

?

?NNN

:VVV

@VVV

$VVV

参数编号从1开始,例如:INSERT into db values(?1, ?2)  
v2版本函数时SQLite根据需要添加的增强函数,新的程序推荐使用v2版本函数,只需与原来函数的区别,可以参考官方原文  

int sqlite3_step(sqlite3_stmt*); 

执行一次预编译SQL语句,在这之前,如果SQL是参数化的,可以调用sqlite3_bind来绑定数据,int、string、blob等等 如果执行成功会返回SQLITE_DONE,如果查询有结果会返回SQLITE_ROW,并可以通过API获取结果中的第一行数据,需要获取下一行数据可以再次调用sqlite3_step直到返回SQLITE_DONE表示后面没有数据了 如果需要重新对预编译的SQL绑定数据并执行,需要先reset一下,然后再调用step,即函数: 

int sqlite3_reset(sqlite3_stmt *pStmt);  

下面是绑定数据到预编译SQL语句的相关函数: 
以下函数的第一个参数指代预编译的SQL句柄,
第二个参数指代绑定的参数编号,
对应于参数化的SQL语句中的参数编号:  

int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); 

该函数用于绑定二进制数据BLOB,其中最后一个参数是一个回调函数,当成功绑定数据后,会被调用,一般用于自动释放对应的缓冲区  

第1个参数:sqlite3_stmt * 类型变量。
第2个参数:?号的索引。前面prepare的sql语句里有一个?号,假如有多个?号怎么插入?方法就是改变 bind_blob 函数第2个参数。这个参数我写1,表示这里插入的值要替换 stat 的第一个?号(这里的索引从1开始计数,而非从0开始)。如果你有多个?号,就写多个 bind_blob 语句,并改变它们的第2个参数就替换到不同的?号。如果有?号没有替换,sqlite为它取值null。
第3个参数:二进制数据起始指针。
第4个参数:二进制数据的长度,以字节为单位。
第5个参数:是个析够回调函数,告诉sqlite当把数据处理完后调用此函数来析够你的数据。这个参数我还没 有使用过,因此理解也不深刻。但是一般都填NULL,需要释放的内存自己用代码来释放。
bind完了之后,二进制数据就进入了你的“sql语句”里了。

int sqlite3_bind_double(sqlite3_stmt*, int, double); 

该函数绑定double浮点数  

int sqlite3_bind_int(sqlite3_stmt*, int, int); 

该函数绑定int整数  

int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); 

该函数用于绑定具有64位长度的整数,对应于C中的long long结构,由于一个int的范围可能无法满足超大数据量的要求,所以SQLite也支持64位整数,毕竟SQLite官方声称SQLite是支持最大2T的数据的  

int sqlite3_bind_null(sqlite3_stmt*, int); 

该函数绑定一个空数据到指定列  

int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));

该函数绑定一段字符串,源字符串是UTF8编码的  

int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); 

该函数绑定一段字符串,源字符串是UTF16编码的  

int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); 

该函数绑定以SQLite结构sqlite3_value存储的通用数据,其中sqlite3_value可以是上述的所有类型,此函数不太常用  

int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); 

该函数绑定指定大小的全零BLOB数据  

3。获取SQL查询结果 对于SELECT语句,还需要能够获取结果。

上面也提到调用sqlite3_step之后,对于有结果的查询会返回第一行结果,

这时可以通过API函数获取当前行的指定字段结果:  

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); 

该函数以BLOB数据格式获取对应列的数据,BOLB长度使用sqlite3_column_bytes获取  

int sqlite3_column_bytes(sqlite3_stmt*, int iCol); 

int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); 

该函数可以用于返回BLOB和字符串的字节长度。对于BLOB,两个函数效果是一样的,

但是对于字符串sqlite3_column_bytes返回的是UTF8编码的字符串长度,

而sqlite3_column_bytes16返回的是UTF16编码的字符串长度,其间会做必要的字符串格式转换  

double sqlite3_column_double(sqlite3_stmt*, int iCol); 

该函数返回double数据列  

int sqlite3_column_int(sqlite3_stmt*, int iCol); 

该函数返回int数据列  

sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); 

该函数返回64位整数,即long long数据  

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); 

const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); 

该函数返回字符串,其中sqlite3_column_text输出的字符串使用UTF8编码  

sqlite3_column_text16使用UTF16编码 

int sqlite3_column_type(sqlite3_stmt*, int iCol); 

该函数返回对应列的数据类型  

sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); 

该函数以sqlite3_value结构体返回数据  

上面是根据列ID来获取对应的列数据的,如果想通过列名称获取列数据,则需要将列名称转换为对应的列ID,

可以使用下面的函数: 

const char *sqlite3_column_name(sqlite3_stmt*, int N); 

const void *sqlite3_column_name16(sqlite3_stmt*, int N); 

该函数返回对应列的名称  

4、关闭数据库 

 int sqlite3_close(sqlite3 * db); 

使用该函数可以关闭数据库

猜你喜欢

转载自blog.csdn.net/huangan_xixi/article/details/51908279