Sqlite3数据库常用API说明

    sqlite3的学习笔记:
        
    Sqilte是目前最流行的嵌入式数据库,其特点为占用资源少,管理简单,操作简单,生成的数据库文件很容易与各个平台兼容。    
    注意:
    1、因为Sqlite的数据管理机制更多依赖于OA文件系统,他不适用于网络传输的传输方式。
    2、受自身机制影响,Sqlite不适用于处理大数据与大数据存储。
    2、Sqlite只提供了表级锁,没有提供实际的锁机制,所以很难适用于高并发处理。
    
    在Sqlite提供了两个重要对象:database_connection和prepared_statement
    database_connection:
        1、database_connection对象是由sqlite3_open接口函数创建并返回的。
        2、在其他应用程序调用Sqlite3相关接口时,都需要这个对象作为输入来完成操作。
    prepared_statement:
        1、编译后的SQL语句。是select、insect、updata···
        2、所有和SQL语句执行相关的函数也都需要 该对象作为输入参数以完成指定的SQL操作。
        
    Sqlite3提供的常用API:
        注意:函数带有···v2的是Sqlite3提供的新版接口,没有的是旧版本接口。

1、

int sqlite3_open(

		  const char *filename,   /* Database filename (UTF-8) */

		  sqlite3 **ppDb          /* OUT: SQLite db handle */

		);

函数功能:打开一个操作数据库
    参数说明:
    filename:据库文件名称,若不存在,会自动创建。
    ppDb:重要数据结构的指针
    返回值:若打开或者创建成功,则会返回SQLITE_OK,否则会返回错误码。

2、

int sqlite3_close(sqlite3 *ppDb);

    函数功能:关闭一个执行完操作的数据库
    参数说明:
    ppDb:splite3_open操作时的第二个参数

3、

const char *sqlite3_errmsg(sqlite3*ppDb);

    函数功能:获取数据库操作错误时的错误码
    参数说明:
    ppDb:splite3_open操作时的第二个参数

4、

int sqlite3_exec(
	  sqlite3* ppDb,                             /* 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 */
	);

函数功能:执行sql指定的数据库命令操作。
    参数说明:
    ppDb:splite3_open操作时的第二个参数
    sql:SQL命令,可以有多条命令组成
    callback:执行完该函数的回调函数
    void *:作为callback回调函数的第一个参数传入
    errmsg:获取函数错误是的错误码
    注意:其实是sqlite3_exec在查询表的时候,每查到一条记录,就会调用一次回调函数,所以才是会显示出所有数据,而在插入,删除,更新执行一次。

5、

int sqlite_callback( 
  void* pvoid, 
  int argc, 
  char** argv, 
  char** col
); 

参数说明:
    pvoid:由 sqlite3_exec() 的第四个参数传递而来
    argc:表的列数或者记录中包含的字段数目
    argv:指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到 ,包含每个字段值的指针数组
    col:指向表头名的指针数组, 可以由 sqlite3_column_name() 得到,包含每个字段名称的指针数组

6、

int sqlite3_get_table(
	  sqlite3 *ppDb,          /* An open database */
	  const char *zSql,     /* SQL to be evaluated */
	  char ***dbResult,     /* Results of the query */
	  int *pnRow,           /* Number of result rows written here */
	  int *pnColumn,        /* Number of result columns written here */
	  char **pzErrmsg       /* Error msg written here */
	);

    函数功能:获取数据库表格
    函数参数:
    ppDb:同上
    zSql:SQL命令
    dbResult:查询结果,它依然是一维数组,它内存布局是:字段名称,后面是紧接着是每个字段的值。
    pnRow:查出具体有多少行,即多少条记录(不包括字段名那行)。
    pnColumn:查出具体有多少列,即多少字段
    pzErrmsg:错误信息

7、

int sqlite3_prepare_v2(
	  sqlite3 *ppDb,            /* Database handle */
	  const char *zSql,       /* SQL statement, UTF-8 encoded */
	  int nByte,              /* Maximum length of zSql in bytes. */
	  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
	  const char **pzTail     /* OUT: Pointer to unused portion of zSql */
	);

函数功能:将SQL操作命令转换成一个准备对象,并返回这个对象的指针。
    参数说明:
    ppDb:同上
    zSql:SQL语句,新旧版本使用不同的编码
    nByte:若为负,从zSql中取出,直到第一个0终止符终止;如果为非负,它则是这个函数能读取Zsql的最大字节数。
    ppStmt:能够使用sqlite3_step()执行的编译好的准备语句的指针,如果错误发生,它被置为NULL,如假如输入的文本不包括SQL语句,调用过程必须负责在编译好的sql语句完成使用后使用sqlite3_finalize()删除它。
    pzTail:上面提到zSql在遇见终止符或者是达到设定的nByte之后结束,假如zSql还有剩余的内容,那么这些剩余的内容被存放到pZTail中,不包括终止符.

8、

int sqlite3_step(sqlite3_stmt*);

        函数功能:用于执行有前面sqlite3_prepare创建的准备语句,执行到结果的第一行可用的位置。需要前进到下一行,只需要继续调用sqlite3_step即可。
    那些不返回结果的语句(如:INSERT,UPDATE,或DELETE),sqlite3_step()只执行一次就返回。
    
    参数说明:
    sqlite3_stmt是结构体struct sqlite3_stmt变量。

9、

int sqlite3_reset(sqlite3_stmt *pStmt);

     函数功能:恢复一个对象,回到最初始的状态
    参数说明:同上

10、

int sqlite3_finalize(sqlite3_stmt *pStmt);

函数功能:销毁前面sqlite3_prepare_v2的准备语句,防止内存泄漏。

11、

const void *sqlite3_column_xxxx(sqlite3_stmt*, int iCol);//前缀函数

执行sqlite3_step执行一个准备语句得到的结果集的当前行中返回的一个列,但每次sqlite3_step执行完得到第一个结果集的列就停止,使用者类函数可以针对多列的情况。后面的后缀是要转换返回的类型。
        参数说明:
        sqlite3_stmt:同上
        iCol:返回列的索引,最左边的为0
        常见的函数:转换参考:https://blog.csdn.net/yishuige/article/details/52574569
                            http://www.yfvb.com/help/sqlite3/index.htm?page=sqlite3_column_blob.htm

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);	//将列值作为blob返回。
		int sqlite3_column_bytes(sqlite3_stmt*, int iCol);			//返回列值的字节数
		int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);		//返回列值的字节数,UTF-16编码
		double sqlite3_column_double(sqlite3_stmt*, int iCol);		//返回值为double
		int sqlite3_column_int(sqlite3_stmt*, int iCol);			//返回列值为long。
		sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);//以四进制形式返回列值
		const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);//以UTF-8字符串的形式返回列值。
		const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);	//以UTF-16字符串的形式返回列值。
		int sqlite3_column_type(sqlite3_stmt*, int iCol);			//返回列类型
		sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);//返回列值作为指向不受保护的sqlite3_value对象的指针
		int sqlite3_column_count(sqlite3_stmt *pStmt);//返回准备语句返回的结果集中的列数。如果数PreparedStatementpstmt是不返回数据(例如UPDATE)的SQL语句,则此函数返回0。
		const char *sqlite3_column_decltype16(sqlite3_stmt*,int)	//返回查询结果的声明数据类型。
		int sqlite3_column_bytes(sqlite3_stmt*, int iCol)			//返回列值的字节数
		int sqlite3_column_bytes16(sqlite3_stmt*, int iCol)			//返回列值的字节数
		const char *sqlite3_column_database_name(sqlite3_stmt*,int);//返回数据库名称,它是SELECT语句中特定结果列的原点
		const char *sqlite3_column_origin_name(sqlite3_stmt*,int)	//返回作为SELECT语句中特定结果列的原点的列名。
		const char *column_table_name(sqlite3_stmt*,int);			//返回表名,它是SELECT语句中特定结果列的起始位置

    两个函数返回对应列的内容的字节数,这个字节数不包括后面类型转换过程中加上的0终止符。
        
        下面是几个最安全和最简单的使用策略
        先sqlite3_column_text() ,然后 sqlite3_column_bytes()
        先sqlite3_column_blob(),然后sqlite3_column_bytes()
        先sqlite3_column_text16(),然后sqlite3_column_bytes16()

12、

int sqlite3_bind_xxx绑定函数

函数功能:为语句对象增加数据
        常用的函数:参数说明见:http://www.sqlite.org/c3ref/bind_blob.html
        http://www.yfvb.com/help/sqlite3/index.htm?page=sqlite3_column_blob.htm

		int sqlite3_bind_blob(sqlite3_stmt *,int,const void *,int n,void(*)(void *));
		int sqlite3_bind_blob64(sqlite3_stmt *,int,const void *,sqlite3_uint64,
								空隙(*)(无效*));
		int sqlite3_bind_double(sqlite3_stmt *,int,double);
		int sqlite3_bind_int(sqlite3_stmt *,int,int);
		int sqlite3_bind_int64(sqlite3_stmt *,int,sqlite3_int64);
		int sqlite3_bind_null(sqlite3_stmt *,int);
		int sqlite3_bind_text(sqlite3_stmt *,int,const char *,int,void(*)(void *));
		int sqlite3_bind_text16(sqlite3_stmt *,int,const void *,int,void(*)(void *));
		int sqlite3_bind_text64(sqlite3_stmt *,int,const char *,sqlite3_uint64,
								 void(*)(void *),unsigned char encoding);
		int sqlite3_bind_value(sqlite3_stmt *,int,const sqlite3_value *);
		int sqlite3_bind_pointer(sqlite3_stmt *,int,void *,const char *,void(*)(void *));
		int sqlite3_bind_zeroblob(sqlite3_stmt *,int,int n);
		int sqlite3_bind_zeroblob64(sqlite3_stmt *,int,sqlite3_uint64);

        在输入sqlite3_prepare_v2()及其变体的SQL语句文本中,文字可能会被匹配以下模板之一的参数替换:
        ·?
        ·?NNN
        ·:VVV
        ·@VVV
        ·$ VVV
    在上面的模板中,NNN表示整数文字,VVV表示字母数字标识符。可以使用此处定义的sqlite3_bind()例程来设置这些参数的值(也称为“主机参数名称”或“SQL参数”)。
        
        参数说明:
        第一个参数:指向sqlite3_prepare_v2()或其变体返回的sqlite3_stmt对象的指针
        第二个参数:要设置的SQL参数的索引。最左边的SQL参数的索引为1.当同一个命名的SQL参数被多次使用时,第二次和后续出现的索引与第一次出现的索引相同。如果需要,可以使用sqlite3_bind_parameter_index() API查找命名参数的索引 。“?NNN”参数的索引是NNN的值。NNN值必须介于1和sqlite3_limit() 参数SQLITE_LIMIT_VARIABLE_NUMBER之间(默认值:999)。
        第三个参数:绑定到参数的值。
        如果sqlite3_bind_text()或sqlite3_bind_text16()或sqlite3_bind_blob()的第三个参数是NULL指针,则忽略第四个参数,最终结果与sqlite3_bind_null()相同。
        第四个参数:针对有这个参数的函数而言,其值是参数中的字节数。要清楚:值是字节数在值中,而不是字符数。
        如果sqlite3_bind_text()或sqlite3_bind_text16()的第四个参数为负,则字符串的长度是直到第一个零终止符的字节数。
        如果向sqlite3_bind_text()或sqlite3_bind_text16()或sqlite3_bind_text64()提供了非负第四个参数,则该参数必须是假定字符串NUL终止时NUL终结符将发生的字节偏移量,如果在字节偏移小于第四个参数的值时出现任何NUL字符,则结果字符串值将包含嵌入的NUL。涉及具有嵌入式NUL的字符串的表达式的结果是未定义的。
        如果sqlite3_bind_blob()的第四个参数为负数,则行为未定义。
        
        第五个参数:针对有第五个参数的blob而言。是一个析构函数,用于在SQLite完成后处理BLOB或字符串。即使对绑定API的调用失败,也会调用析构函数来处理BLOB或字符串,但如果第三个参数是NULL指针或第四个参数为负,则不会调用析构函数。如果第五个参数是特殊值SQLITE_STATIC,那么SQLite假定信息在静态的非托管空间中,并且不需要释放。如果第五个参数的值为SQLITE_TRANSIENT,则SQLite会在sqlite3_bind _ *()例程返回之前立即创建自己的数据私有副本。
    
        第六个参数:指定编码
        sqlite3_bind_text64()的第六个参数必须是 SQLITE_UTF8,SQLITE_UTF16,SQLITE_UTF16BE或SQLITE_UTF16LE之一, 以指定第三个参数中文本的编码。如果sqlite3_bind_text64()的第六个参数不是上面显示的允许值之一,或者如果文本编码与第六个参数指定的编码不同,则行为未定义。

        注意:
        1、在批量插入数据时,执行一次sqlite3_prepare_v2比sqlite3_step消耗的时间多得多,因此应该尽量避免重复调用sqlite3_prepare_v2。在我们的实现中,如果想避免此类开销,只需将待插入的数据以变量的形式绑定到SQL语句中,这样该SQL语句仅需调用sqlite3_prepare_v2函数编译一次即可,其后的操作只是替换 不同的变量数值。
        2、SQL语句"insert into testtable values(?)"中的问号(?)表示参数变量的占位符,该规则在很多关系型数据库中都是一致的,因此这对于数据库移植操作还是比较方便的。

你可能感兴趣的:(SQLITE3)