嵌入式设备的资源是非常珍贵的,直接决定了产品前期开发的投入,而在后期将影响产品投放市场后的利益回报率的高低。小型的许多嵌入式设备在存储上都做了必要的让步,采用文件存储这样比较传统但是方便的方法。而对于数据量比较大,数据读入读出比较频繁的项目,大家都比较倚重sqlserver,Oracle等大型数据库。我没做过具体的数据分析,只是简单在网上看过一些统计资料。笔者曾做过基于sqlite3的应用开发,为一个项目提供简易的数据管理平台。所谓sqlite3是sqlite Version3的缩写,由此可见还有前面2个版本。这些版本之间有一个过渡历程,其间的差异我没仔细研究,望大家上官网或者国内一些强人的博客。sqlite作为开源的数据库管理软件,正是因为它占用内存小,运行稳定,开发容易,维护简单,如今逐步在嵌入式行业里得到广泛推广和应用。相比较大型数据库而言,这款嵌入式数据库的很多劣势,在如今的嵌入式行业中却摇身一变,成就了它的优势:它比普通的文件存储更安全,比大型数据库维护更方便 …… 。
从运行上看:sqlite和你的应用程序运行在一个地址空间—应用程序的进程空间。它被设计成用户程序的一部分,作为API编译进你的程序中;从使用角度看,它不是一个数据库管理系统,但它却是完整的,拥有自己的数据库引擎。我没仔细看过sqlite3的内核,但是查资料,转官方网站搜集了基本的操作API,现在列出来,算不上多么深奥,但是希望能和大家共同进步。
sqlite基本的用户接口
操作sqlite的基本步骤和我们操作普通文件的步骤有些类似:打开,操作,关闭。
数据库的打开interface
在查看sqlite源码的时候,我们不难找到int sqlite3_open(const char *zFilename,sqlite3 **ppDb)这样的定义,这就是sqlite为我们提供的打开一个数据库的interface。定义:
1 sqlITE_API int sqlite3_open(const char *zFilename,sqlite3 **ppDb ){ 2 3 return openDatabase(zFilename,ppDb,4 5 sqlITE_OPEN_READWRITE | sqlITE_OPEN_CREATE,0); 6 7 }
zFilename:数据库路径;ppDb:作为sqlite3_open的传出参数,打开zFilename后,由ppDb指向一个sqlite3的结构,该结构存储数据库的信息,很大的结构体,我没怎么看懂。
默认情况下,sqlite按照允许I/O操作的方式打开数据库,如果所描述之路径不存在该数据库,则新建。查资料得出:sqlite不会立即在磁盘创建文件,只有当操作者发出写磁盘的命令时,该文件才最终创建。一个写操作,只有到了最后,才能真正写到数据库。
数据库的操作interface
数据库的操作,也被称之为事务的执行。在sqlite中,所有的sql都在“事务”方式下被执行,也就是说一个或者多个操作之间的原子性有了保证。默认情况下,事务自动提交(听说也能手动,没试过)。
该接口实现对db的操作,动作由zsql指定,包括查询、更新、修改、删除等,第三个参数是一个回调方法的入口,当sqlite3_exec执行后,需要请求该接口实现与用户的交互(对于用户应用来说,主要是输出操作结果),pArg是传给xCallback的参数,pzErrMsg指向sqlite操作失败的信息。
sqlite对用户接口和私有接口的定义都非常明显,用户接口及类型用sqlITE_API生命,私有接口(不对外开放,仅供sqlite内部使用) 及类型,用sqlITE_PRIVATE来声明,对于sqlite内可互相调用的接口及类型,用sqlITE_EXTERN来声明。
sqlite的预处理机制
在sqlite执行每条sql语句的时候,都会进行查询预处理操作。我们共同来探讨一下sqlite的执行interface内,对每一条sql语句都做了怎样的处理,以及如何将执行结果展现在我们面前。
检测数据库有效性
sqlite3SafetyCheckOk检查指定的数据库现在能不能得到安全的操作。该方法执行成功,表示数据库被“滥用”了,终止后面操作;
预处理
数据库的句柄有效,通过sqlite3_prepare将sql语句处理成VDBE编码:VDBE编码。同时创建一个创建一个statement句柄交给sqlite3_step。statement句柄包含了要执行的数据库操作,由成员aOp持有,例如:insert?delete?update?and so on…
执行
sqlite执行是按照“步”的概念进行的。预处理完成后,得到一个sqlite3_stmt 结构,给sqlite3_step,启动执行步。每启动一步,由sqlite3VdbeExec执行一段VDBE编码,在执行编码的时候,按照预处理操作aOp指定的操作分类处理。执行一个step后,调用回调函数,处理执行结果。
终结
sqlite3VdbeFinalize释放资源,终结操作。
总之,在进行一个sql处理的时候,sqlite要经过三个步骤来完成一条语句的执行:sql预处理(sqlite3_prepare),步进执行(sqlite3_step)和终结(sqlite3_finalize)。
Host安装sqlite
下载
官方下载地址:http://www.sqlite.org/download.html
作者博客使用的版本:http://files.cnblogs.com/iTsihang/sqlite-3.7.2.tar.zip
解压并安装
./configure;make;make install
例子
学习最好的老师就是动手,学习sqlite的接口,我写了一个简单的测试例子。该例实现数据库的查询,插入和删除操作。下载链接:http://files.cnblogs.com/iTsihang/sqlite-t.tar.zip
结束语:虽然浅陋,但是真心希望能帮到大家