【原】SQLite — 一款嵌入式开源数据库

 

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 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

 

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

 

你可能感兴趣的:(sqlite)