1简介
sqlite是一个开源的嵌入式关系数据库,它在2000年由D. Richard Hipp发布,它的减少应用程序管理数据的开销,sqlite可移植性好,可以工作在许多嵌入式操作系统下,比如QNX,VxWorks,Palm OS,Symbin和Windows CE,同时,sqlite是一个轻量级的嵌入式数据库,很适合用于嵌入式设备。
sqlite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程,但在进程内部,它却是完整的自包含的数据库引擎。
准备工作
sqlite API介绍
2编译安装
官网下载地址:http://www.sqlite.org/sqlite-amalgamation-3.6.22.tar.gz
基于实际项目需求,以下主要讲述交叉编译的步骤:
2.1
$ tar zxf sqlite-amalgamation-3.6.22.tar.gz
$ cd sqlite-3.6.22
$ CC=ppc_8xx-gcc LD=ppc_8xx-ld ./configure --host=ppc-linux
$ make
2.2
由于在主机上已经有x86版本的libsqlite3.so,我们交叉编译生成的libsqlite3.so不能在主机上make install,否则会覆盖掉x86版本的libsqlite3.so.我们编译应用程序时要把交叉编译出的libsqlite3.so拷到应用程序工程目录中,最好是和应用程序的Makefile同一级目录中,同时要把sqlite3.h头文件拷到同一级目录中,并在Makefile中用-L. –I.分别指定库和头文件路径,最后将交叉编译生成的应用程序和在主机上建好的XX.db数据库文件拷贝到目标板上同一级目录中,将交叉编译出的libsqlite3.so拷到目标板的/usr/lib目录中,同时在/usr/lib中建立一个指向libsqlite3.so的软链接libsqlite3.so.0, 否则会报错。另外如果需要在目标板上使用sqlite3的命令行命令,则还需要将交叉编译出的可执行文件sqlite3拷贝到目标板上/usr/bin中.
3常用命令
$ sqlite3 test.db //创建/打开数据库文件
sqlite>
sqlite> create table table_name(id integer primary key,name text,gender text,age integer); //创建表格示例
sqlite> .tables //显示test.db中存在的表格
sqlite> .schema table_name //显示表名及各字段的名称/数据类型
sqlite> .drop table table_name //删除表
sqlite> .import data.txt table_name //从数据文件data.txt中导入数据到表格中,data.txt中每一列用|分隔,|两边不要空格,文件末尾不要有空行:
例如 1|richardstallman|male|24
4sql语句示例
//插入一条记录到表里
insert into table_name values (5,'li','female',23);
// 查询id字段大于2的记录,并根据年龄字段按降序排列
select * from table_name where id>2 order by age desc;
// 查询id字段大于2的记录,并只显示id,name,gender三个字段
select id>2,gender from table_name;
// 显示表中的所有记录
select * from table_name;
// 从第三行开始,查询10条记录:
select * from table_name limit 3,10;
// 删除id字段等于5或name字段为’tom’的记录
delete from table_name where id=5 or name='tom';
// 更新表中name字段为‘zh’的记录的age和name字段的值
update table_name set age=25,name='zhang' where name='zh';
select * from table_name where id like '%216%';
5 API
int sqlite3_open(const char *filepath,sqlite3 **db);
int sqlite3_exec(
sqlite3 *db,/* An open database */
const char *sql,/* sql to be executed */
sqlite_callback,/* Callback function */
void *,/* 1st argument to callback function */
char **errmsg /* Error msg written here */
};
int sqlite3_get_table(
sqlite3 *db,/* sql command string */
char ***dbresult,/* the address of a char **buffer which to hold enquiry result */
int *nRow,/* Row of segment */
int *nColumn,/* Column of segment */
char **errmsg); /* error message buffer */
int sqlite3_close(sqlite3 *db);
6
sqlite 是支持事务处理的。如果你知道你要同步删除很多数据,不仿把它们做成一个统一的事务。通常一次 sqlite3_exec 就是一次事务,如果你要删除1万条数据,sqlite就做了1万次:开始新事务->删除一条数据->提交事务->开始新事务->… 的过程。这个操作是很慢的。因为时间都花在了开始事务、提交事务上。你可以把这些同类操作做成一个事务,这样如果操作错误,还能够回滚事务。事务的操作没有特别的接口函数,它就是一个普通的 sql 语句而已。
分别如下:
int result;
result = sqlite3_exec( db,"begin transaction",&zErrorMsg ); //开始一个事务
result = sqlite3_exec( db,"commit transaction",&zErrorMsg ); //提交事务
result = sqlite3_exec( db,"rollback transaction",&zErrorMsg ); //回滚事务
7API
int db_init(const char *db_filepath,db_handler **db);
int db_sql(db_handler *db,const char *sql,char ***dbresult,int *nRow,int *nColumn,char **errmsg);
int db_term(db_handler *db,char **dbresult);
8程序
/* test_db.c */
#include "db.h"
int main( int argc,char **argv)
{
db_handler *db;
int result;
char *errmsg = NULL;
char **dbResult;
int nRow,nColumn;
int i,j;
int index;
if (argc != 2)
{
fprintf(stderr,"Usage: %s <db_file>\n",argv[0]);
return -1;
}
result = db_init(argv[1],&db);
if(result != DB_OK)
{
//Failed to open database
return -1;
}
result = db_sql( db,"select * from table1",&dbResult,&nRow,&nColumn,&errmsg );
if(DB_OK == result)
{
// sql operation is success
// dbResult 的字段值是连续的,从第0索引到第 nColumn - 1索引都是字段名称,从第 nColumn 索引开始才是字段值
index = nColumn;
printf("found %d record\n",nRow);
for(i = 0; i < nRow ; i++)
{
printf("record %d\n",i+1);
for( j = 0 ; j < nColumn; j++ )
{
printf("segment name:%s \t\tsegment value:%s\n",dbResult[j],dbResult[index]);
++index;
}
printf("-------\n");
}
}
db_term(db,dbResult);
return 0;
}
/* Makefile */
OBJ+=app
SRC+=db.c test_db.c
CFLAG=-lsqlite3 -L. -I.
CC=gcc
CROSS_COMPILE=ppc_8xx-
$(OBJ): $(SRC)
$(CROSS_COMPILE)$(CC) -o $@ $^ $(CFLAG)
clean:
rm -rf $(OBJ)