SQLite是一款很有名气的小型开源跨平台数据库,作为目前最流行的开源嵌入式关系型数据库,在系统结构设计中正在扮演着越来越重要的角色。
本文主要沿着 http://www.cppblog.com/weiym/archive/2012/10/16/193357.html 这篇文章里面的学习指导思想,来一步步学习SQLite,为的是快速在实际开发中利用好SQLite。
1. SQLite的优缺点以及适用场合
1. 1 优点
轻量级: 与传统的C/S模式的数据库软件不同,它是进程内的数据库引擎,不存在客户端和服务器。使用SQLite,只需要带上一个几百K大小的动态库就可以:
绿色组件: SQLite的核心引擎本身不依赖第三方软件,即插即用。
单一文件: 数据库中所有的信息(比如表、视图、触发器等)都保存在单个文件内,可以拷贝到其他地方,照用不误。
跨平台 : 不仅仅支持主流操作系统(Windows/Linux),还支持很多小型嵌入式系统(Android,WP,Vxworks)。
查询效率极高 : SQLite的API不区分当前数据库是保存在内存中还是在磁盘文件中,为了提高效率,可以切换为内存方式。只需要在开始时将数据库载入内存,读写完成后,再把内存数据库dump会磁盘文件上就可以,读写内存比读写磁盘快很多倍。
1.2 缺点
并发访问的锁机制: SQLite在并发读写方面的性能一直不太理想,在有大量insert,update访问时,不建议使用。
SQL标准支持不全 :
1.3适用场合
适合查询速度要求较高,内存占用较少的场合,尤其是嵌入式操作系统,如各种手机操作系统,低并发web(99.9%网站是低并发),php环境里原生支持SQLite,asp.net/.net winform里可以很方便的使用System.Data.SQLite.
SQLite本身是C写的,自带的API接口也是C接口,所以用C/C++来使用是最直接的了。对于Java语言来说,可以通过SQLite的JDBC接口方式使用SQLite,对于Python,pysqlite是操作SQLite的首选,它已经是Python的标准库之一。
SQLite使用的授权协议时Public Domain协议,可以大胆的使用。
2. SQL的核心组件
SQL中有两个核心对象,分别为database_connection和prepared_statement 的使用。
database_connection对象是通过sqllite3_open()接口函数创建并返回的,在应用程序使用任何其他SQLite接口函数之前,必须先调用该函数用于初始化。
prepared_statement对象可以简单理解为编译后的SQL语句,所有和SQL语句执行相关的函数需要该对象作为输入参数用于完成指定SQL操作。
SQL提供的核心接口函数有
sqlite_open
sqlite_prepare
sqlite_step(评估prepared_statement对象)
sqlite3_column(获取当前行指定列的数据)
sqlite3_finalize 用于销毁prepared_statement对象
sqlite_close 用于关闭database_connection对象
3. 在CodeBlock上集成SQLite
首先去SQLite官网上面下载最新版的源码,http://www.sqlite.org/download.html,我下载的是sqlite-amalgamation-3080704.zip版本。
解压此压缩包,得到如下几个文件:
往你的项目里面添加上述文件(除了shell.c文件),然后按Ctrl+F9编译,就可以。
这么强大的SQLite,真正起作用的,只有三个文件,不由得佩服开发者。通过阅读官网上的编译入门资料,得知源码有两种下载版本,一种是混合式的,上述下载的就是这样的,它在sqlite3.c中实现了全部的SQLite库中的内容,sqlite3.h定义了sqlite3.c的接口函数,很容易整合进所需要的工程文件中。
常用的SQLite的Shell命令:
.tables 查看当前的SQLite数据库命令
.schema 查看创建SQLite数据库的命令
参考链接:
http://stackoverflow.com/questions/11574280/how-to-use-sqlite-in-c-program-using-codeblocks
附录:
SQLite的官方主页:
http://www.sqlite.org/
SQLite中文站:
http://www.sqlite.com.cn/
System.Data.SQLite:
http://sqlite.phxsoftware.com/
sql学习笔记之 嵌入式数据库(sqlite,firebird)
http://www.cnblogs.com/ljzforever/archive/2010/03/09/1681453.html