sqlite3 — 轻量级嵌入式平台数据库开源软件

前端之家收集整理的这篇文章主要介绍了sqlite3 — 轻量级嵌入式平台数据库开源软件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


嵌入式设备的资源是非常珍贵的,直接决定了产品前期开发的投入,而在后期将影响产品投放市场后的利益回报率的高低。小型的许多嵌入式设备在存储上都做了必要的让步,采用文件存储这样比较传统但是方便的方法。而对于数据量比较大,数据读入读出比较频繁的项目,大家都比较倚重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都在“事务”方式下被执行,也就是说一个或者多个操作之间的原子性有了保证。默认情况下,事务自动提交(听说也能手动,没试过)。

1 sqlITE_API int sqlite3_exec( 2 3 sqlite3 *db,/* The database on which the sql executes */ 4 5 char *zsql,0)"> The sql to be executed 6 7 sqlite3_callback xCallback,0)"> Invoke this callback routine 8 9 void *pArg,0)"> First argument to xCallback() 10 11 char **pzErrMsg Write error messages here 12 13 )

该接口实现对db的操作,动作由zsql指定,包括查询、更新、修改删除等,第三个参数是一个回调方法的入口,当sqlite3_exec执行后,需要请求该接口实现与用户的交互(对于用户应用来说,主要是输出操作结果),pArg是传给xCallback的参数,pzErrMsg指向sqlite操作失败的信息。

数据库关闭interface

1 sqlITE_API int sqlite3_close(sqlite3 *db)

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

结束语:虽然浅陋,但是真心希望能帮到大家

【本博客 http://www.cnblogs.com/iTsihang 中原创之博文,版权属作者所有,欢迎转载。转载之时请保留本段内容,否则作者将保留追究版权之权利】
原文链接:https://www.f2er.com/sqlite/199438.html

猜你在找的Sqlite相关文章