转载:
http://www.cnblogs.com/myqiao/archive/2011/07/10/2102465.html 入门教程
https://www.sqlite.org/c3ref/column_blob.html
http://blog.sina.com.cn/s/blog_a7c44c880101do3d.html
1、sqlite3_open
在操作数据库之前需要先通过该接口打开,这个函数的原型为:
SQLITE_API int sqlite3_open(
const char *filename, /*Database filename (UTF-8) */
sqlite3 **ppDb /* OUT:SQLite db handle */
);
打开 filename 指定的数据库,并通过 ppDb 返回数据库的连接对象,如果指定的数据库不存在则创建一个同名的数据库,数据库采用 UTF-8 的编码方式。
2、sqlite3_prepare
这个函数将一条 SQL 语句转换为一个准备语句对象,同时返回这个对象的指针(Statement handle),函数原型如下:
SQLITE_API int sqlite3_prepare(
sqlite3 *db, /*Database handle */
const char *zSql, /* SQLstatement, UTF-8 encoded */
intnByte, /* Maximum length ofzSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT:Statement handle */
const char **pzTail /* OUT:Pointer to unused portion of zSql */
);
其中 db 为 sqlite3_open 的返回值,zSql 为 SQL 语句,nByte 一般设置为 -1,ppStmt 为准备语句指针。
3、sqlite3_step
该函数执行 sqlite3_prepare 创建好的准备语句,原型如下:
SQLITE_API int sqlite3_step(sqlite3_stmt*);
执行的结果集保存在参数中以便后续使用。
查询一行数据
// 如果查询到一行数据,就会返回SQLITE_ROW
4、sqlite3_column_int
这个函数从 sqlite3_step 执行完后的结果集中返回指定列的值,函数原型为:
SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol);
其中iCol 指定了想要返回的列的索引值,这个函数的返回值为 int 类型。
5、sqlite3_finalize
这个函数用于销毁之前创建的准备语句,以防内存泄露,原型如下:
SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);
这个过程销毁前面被sqlite3_prepare创建的准备语句,每个准备语句都必须使用这个函数去销毁以防止内存泄露。
在空指针上调用这个函数没有什么影响,同时可以准备语句的生命周期的任一时刻调用这个函数:在语句被执行前,一次或多次调用sqlite_reset之后,或者在sqlite3_step任何调用之后不管语句是否完成执行
6、sqlite3_close
这个过程关闭前面使用sqlite3_open打开的数据库连接,任何与这个连接相关的准备语句必须在调用这个关闭函数之前被释放。函数用于关闭打开的数据库。在关机闹钟里面操作数据库的代码如下:
7.执行任何SQL语句
int sqlite3_exec(
sqlite3*, // 一个打开的数据库实例
const char *sql, // 需要执行的SQL语句
int (*callback)(void*,int,char**,char**), // SQL语句执行完毕后的回调
void *, // 回调函数的第1个参数
char **errmsg // 错误信息
);
8.检查SQL语句的合法性(查询前的准备)
int sqlite3_prepare_v2(
sqlite3 *db, // 数据库实例
const char *zSql, //需要检查的SQL语句
int nByte, // SQL语句的最大字节长度
sqlite3_stmt **ppStmt, // sqlite3_stmt实例,用来获得数据库数据
const char **pzTail
);
9. sqlite3_column()
这个过程从执行sqlite3_step()执行一个准备语句得到的结果集的当前行中返回一个列。每次sqlite3_step得到一个结果集的列停下后,这个过程就可以被多次调用去查询这个行的各列的值。对列操作是有多个函数,均以sqlite3_column为前缀
const void*sqlite3_column_blob(sqlite3_stmt*, int iCol);
intsqlite3_column_bytes(sqlite3_stmt*, int iCol);
intsqlite3_column_bytes16(sqlite3_stmt*, int iCol);
doublesqlite3_column_double(sqlite3_stmt*, int iCol);
int sqlite3_column_int(sqlite3_stmt*,int iCol);
sqlite3_int64sqlite3_column_int64(sqlite3_stmt*, int iCol);
const unsignedchar *sqlite3_column_text(sqlite3_stmt*, int iCol);
const void*sqlite3_column_text16(sqlite3_stmt*, int iCol);
intsqlite3_column_type(sqlite3_stmt*, int iCol);
sqlite3_value*sqlite3_column_value(sqlite3_stmt*, int iCol);
说明
第一个参数为从sqlite3_prepare返回来的prepared statement对象的指针,第二参数指定这一行中的想要被返回的列的索引。最左边的一列的索引号是0,行的列数可以使用sqlite3_colum_count()获得。
这些过程会根据情况去转换数值的类型,sqlite内部使用sqlite3_snprintf()去自动进行这个转换,下面是关于转换的细节表:
内部类型 | 请求的类型 | 转换 |
NULL | INTEGER | 结果是0 |
NULL | FLOAT | 结果是0.0 |
NULL | TEXT | 结果是NULL |
NULL | BLOB | 结果是NULL |
INTEGER | FLOAT | 从整形转换到浮点型 |
INTEGER | TEXT | 整形的ASCII码显示 |
INTEGER | BLOB | 同上 |
FLOAT | INTEGER | 浮点型转换到整形 |
FLOAT | TEXT | 浮点型的ASCII显示 |
FLOAT | BLOB | 同上 |
TEXT | INTEGER | 使用atoi() |
TEXT | FLOAT | 使用atof() |
TEXT | BLOB | 没有转换 |
BLOB | INTEGER | 先到TEXT,然后使用atoi |
BLOB | FLOAT | 先到TEXT,然后使用atof |
BLOB | TEXT | 如果需要的话添加0终止符 |
注:BLOB数据类型是指二进制的数据块,比如要在数据库中存放一张图片,这张图片就会以二进制形式存放,在sqlite中对应的数据类型就是BLOB
intsqlite3_column_bytes(sqlite3_stmt*, int iCol)intsqlite3_column_bytes16(sqlite3_stmt*, int iCol)两个函数返回对应列的内容的字节数,这
利用stmt获得某一字段的值(字段的下标从0开始)
double sqlite3_column_double(sqlite3_stmt*, int iCol); // 浮点数据
int sqlite3_column_int(sqlite3_stmt*, int iCol); // 整型数据
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); // 长整型数据
const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); // 二进制文本数据
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); // 字符串数据