前端之家收集整理的这篇文章主要介绍了
SQLite备忘,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
sqlite 是一款开源嵌入式文件型数据库,这个主要是和其他一些C/S架构的关系型数据库比较而来的,比如MysqL等. 说他是嵌入式,因为sqlite的所有功能全部包装在一个dll中,我们只需要使用其中的导出接口就可以操作sqlite数据库,这样使得数据存储功能能够很方便的集成进用户的程序中,并运行在客户程序的进程空间中 说他是文件型,因为sqlite的数据库文件就是一个独立文件(sqlite本身不限制数据库文件的扩展名),再没有其他的了,数据,表结构,查询,视图等等都保存在这个数据库文件中,不会依赖任何数据库环境 sqlite的主要特点: 1.无需部署,0配置,无服务端 2.跨平台 2.数据文件管理方便 3.较完善的sql92标准支持,sqlite基本实现了sql92标准,其他的一些不兼容的地方,可以参看官方相关说明,链接:http://www.sqlite.org/omitted.html 4.sql语句执行速度快,具体的对比数据,网上的评测有很多,这里就不多说了 5.应用较广.最著名的集成应该数Android了吧,其他的PHP,Python等都做了集成,所以还是很不错的 6.完美的Unicode编码支持.sqlite的接口中,凡是涉及字符串的都是用UTF8或UTF16编码交互,有的同时提供这两种编码的接口函数,所以多语种支持绝对不是问题(这也是我偏爱sqlite的很重要的原因,呵呵). sqlite的数据库操作其实和常规的数据库操作流程是一样的: 1.连接数据库. 2.构造sql语句并执行 3.对于SELECT语句,可以获取查询结果 4.数据库使用完毕之后,关闭数据库 这里说明一下,下面所介绍的函数不会涵盖所有的API函数,毕竟sqlite针对同一个功能点提供了不同的API函数,主要表现在参数和配置功能上,有需要深入了解的朋友可以参考官方的文档. 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语句,可以参数化 */ int nByte,/* sql语句的字节长度,可以传递-1,即字符串以\0结尾 */ sqlite3_stmt **ppStmt,/* 输出:预编译之后的sql语句句柄 */ const char **pzTail /* 输出: 指向zsql缓冲区中跳过有效sql字符串的第一个字节 */ ); int sqlite3_prepare_v2( sqlite3 *db,即字符串以宽字符\0结尾 */ sqlite3_stmt **ppStmt,/* 输出: 预编译之后的sql语句句柄 */ const char **pzTail /* 输出: 指向zsql缓冲区中跳过有效sql字符串的第一个字节 */ ); int sqlite3_prepare16( sqlite3 *db,/* 打开的数据库句柄 */ const void *zsql,/* UTF16编码的sql语句,/* 输出: 预编译之后的sql语句句柄 */ const void **pzTail /* 输出: 指向zsql缓冲区中跳过有效sql字符串的第一个字节 */ ); int sqlite3_prepare16_v2( sqlite3 *db,/* 输出: 预编译之后的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来绑定数据,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*,const void*,int n,void(*)(void*)); 该函数用于绑定二进制数据BLOB,其中最后一个参数是一个回调函数,当成功绑定数据后,会被调用,一般用于自动释放对应的缓冲区 int sqlite3_bind_double(sqlite3_stmt*,double); 该函数绑定double浮点数 int sqlite3_bind_int(sqlite3_stmt*,int); 该函数绑定int整数 int sqlite3_bind_int64(sqlite3_stmt*,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*,const char*,void(*)(void*)); 该函数绑定一段字符串,源字符串是UTF8编码的 int sqlite3_bind_text16(sqlite3_stmt*,源字符串是UTF16编码的 int sqlite3_bind_value(sqlite3_stmt*,const sqlite3_value*); 该函数绑定以sqlite结构sqlite3_value存储的通用数据,其中sqlite3_value可以是上述的所有类型,此函数不太常用 int sqlite3_bind_zeroblob(sqlite3_stmt*,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); 使用该函数可以关闭数据库 原文链接:https://www.f2er.com/sqlite/200248.html