说明:这篇文章的内存基本是来自the definitive guide to sqlite这本书,另外强调一个概念是开发中遇到的问题:bind blob
很久之前就用过sqlite,但是现在已经完全没有概念了,再次学习是个很苦恼的过程,所以就写下如下文章作为备份。
首先sqlite如其名,是一个lite的数据库,lite体现在什么地方?体现在不用一个单独的服务器,可以直接集成到当前的程序之中,比较适合APP保存一些自身的数据,其并不太适合做大型网络的数据库。
1)工具
sqlite有一套很好的上手工具,非常方便我们做一些测试,下面的一串shell的脚本介绍了基本用法:
基本的使用命令分成两种,一种是sql语句,另外一种是辅助命令都是以点打头的。另外已点需要强调的是所有sql相关的输入都要以“;”结束。
mike@linux tmp $ sqlite3 test.db // 创建了一个test.db的数据库
SQLite version 3.3.4
Enter ".help" for instructions
sqlite> .h // 这个命令值得仔细看看
sqlite> create table test (id integer primary key, value text);
sqlite> insert into test (value) values('eenie');
sqlite> .mode col
sqlite> .headers on
sqlite> SELECT * FROM test;
sqlite> create index test_idx on test (value);
sqlite> create view schema as select * from sqlite_master;
sqlite> .tables
sqlite> .output file.sql
sqlite> .dump
sqlite> .output stdout
sqlite>.exit
下面是sql语句和数据库之间的相互转换。
sqlite3 test.db .dump > test.sql
sqlite3 test.db < test.sql
有了上面的工具,我们就对当前的数据库了如指掌了,操作起来也更加有信心。
2) sql语法
这一段落顺带记录一些简单的sql语法,同样是用来备忘,sql的语法关键字很多,这里不会都列出来,所以有需要可以去到google查一下
CREATE TABLE contacts ( id INTEGER PRIMARY KEY,
name TEXT NOT NULL COLLATE NOCASE,
phone TEXT NOT NULL DEFAULT 'UNKNOWN',
UNIQUE (name,phone) );
SELECT burger FROM kitchen WHERE patties=2 AND toppings='jalopenos'AND condiment != 'mayo' LIMIT 1;
SELECT id, name FROM foods;
INSERT INTO foods VALUES (NULL, 'Whataburger');
DELETE FROM foods WHERE id=413;
3) API
API一般都会分C和C++两种,区别就是有没有用面向对象的设计模式,一般讲面向对象的API更容易理解一些,但是C的API通用性更强。
数据库的打开和关闭:
sqlite3_open sqlite3_close 这两个是基础。
sql语句的运行
sqlite3_exec 这个是最容易理解的API,就是直接运行sql代码,比较适合修改数据库,如果要查询就稍微有些麻烦,需要写一个回调函数,把这个函数指针作为参数送进去。
sqlite3_get_table 和上面的非常类似,都是简化的API,区别是这个用来查询更加方便,不需要还要回调函数。
复杂的sql语句的运行
一般来讲sql的语句的运行需要经过三个过程:prepare, step, finalize
绑定参数(bind)
有些类型的参数必须使用bind的方式加进去,比如blob类型。
在复杂调用模式中,可以绑定参数,具体做法是先用?或者:之类的指定哪些是要绑定的参数,之后再调用绑定函数,关于绑定的介绍可以参考
http://blog.csdn.net/northcan/article/details/7235519
4)misc
sqlite还有很多高级的运用,比如多线程环境,内存的优化之类的,上面的基本介绍已经能满足日常应用,如果有进一步的优化需求再研究。