您的位置:首页 > 数据库

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

2015-08-11 10:40 330 查看



嵌入式设备的资源是非常珍贵的,直接决定了产品前期开发的投入,而在后期将影响产品投放市场后的利益回报率的高低。小型的许多嵌入式设备在存储上都做了必要的让步,采用文件存储这样比较传统但是方便的方法。而对于数据量比较大,数据读入读出比较频繁的项目,大家都比较倚重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   const char *zSql,           /* The SQL to be executed */
6
7   sqlite3_callback xCallback, /* Invoke this callback routine */
8
9   void *pArg,                 /* 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 中原创之博文,版权属作者所有,欢迎转载。转载之时请保留本段内容,否则作者将保留追究版权之权利】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: