sqlite使用说明及在ppc上的移植.docx
《sqlite使用说明及在ppc上的移植.docx》由会员分享,可在线阅读,更多相关《sqlite使用说明及在ppc上的移植.docx(8页珍藏版)》请在冰点文库上搜索。
![sqlite使用说明及在ppc上的移植.docx](https://file1.bingdoc.com/fileroot1/2023-5/15/3541e8cc-3c5b-47ac-9422-bbaa12805a56/3541e8cc-3c5b-47ac-9422-bbaa12805a561.gif)
sqlite使用说明及在ppc上的移植
目录
1SQLite简介1
2SQLite编译安装1
2.1交叉编译库1
2.2交叉编译应用程序2
3SQLite3常用命令2
4常用SQL语句示例3
5常用API5
6事务处理6
7封装后的API7
8APIdemo程序7
1SQLite简介
SQLite是一个开源的嵌入式关系数据库,它在2000年由D.RichardHipp发布,它的减少应用程序管理数据的开销,SQLite可移植性好,可以工作在许多嵌入式操作系统下,比如QNX,VxWorks,PalmOS,Symbin和WindowsCE,同时,SQLite是一个轻量级的嵌入式数据库,很适合用于嵌入式设备。
SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程,但在进程内部,它却是完整的自包含的数据库引擎。
2SQLite编译安装
官网下载地址:
http:
//www.sqlite.org/sqlite-amalgamation-3.6.22.tar.gz
基于实际项目需求,以下主要讲述交叉编译的步骤:
2.1交叉编译库
$tarzxfsqlite-amalgamation-3.6.22.tar.gz
$cdsqlite-3.6.22
$CC=ppc_8xx-gccLD=ppc_8xx-ld./configure--host=ppc-linux
$make
然后将生成的动态库拷贝到根文件系统/usr/lib中.
2.2交叉编译应用程序
由于在主机上已经有x86版本的libsqlite3.so,我们交叉编译生成的libsqlite3.so不能在主机上makeinstall,否则会覆盖掉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中.
3SQLite3常用命令
$sqlite3test.db//创建/打开数据库文件
sqlite>
sqlite>createtabletable_name(idintegerprimarykey,nametext,gendertext,ageinteger);//创建表格示例
sqlite>.tables//显示test.db中存在的表格
sqlite>.schematable_name//显示表名及各字段的名称/数据类型
sqlite>.droptabletable_name//删除表
sqlite>.importdata.txttable_name//从数据文件data.txt中导入数据到表格中,data.txt中每一列用|分隔,|两边不要空格,文件末尾不要有空行:
例如1|richardstallman|male|24
sqlite>.exit//退出
4常用SQL语句示例
//插入一条记录到表里
insertintotable_namevalues(5,'li','female',23);
//查询id字段大于2的记录,并根据年龄字段按降序排列
select*fromtable_namewhereid>2orderbyagedesc;
//查询id字段大于2的记录,并只显示id,name,gender三个字段
selectid>2,name,genderfromtable_name;
//显示表中的所有记录
select*fromtable_name;
//从第三行开始,查询10条记录:
select*fromtable_namelimit3,10;
//删除id字段等于5或name字段为’tom’的记录
deletefromtable_namewhereid=5orname='tom';
//更新表中name字段为‘zh’的记录的age和name字段的值
updatetable_namesetage=25,name='zhang'wherename='zh';
//部分匹配地模糊查询,模糊查询效率很低,尽量不要使用
select*fromtable_namewhereidlike'%216%';
5常用API
intsqlite3_open(constchar*filepath,sqlite3**db);
intsqlite3_exec(
sqlite3*db,/*Anopendatabase*/
constchar*sql,/*SQLtobeexecuted*/
sqlite_callback,/*Callbackfunction*/
void*,/*1stargumenttocallbackfunction*/
char**errmsg/*Errormsgwrittenhere*/
};
intsqlite3_get_table(
sqlite3*db,/*Anopendatabase*/
constchar*sql,/*SQLcommandstring*/
char***dbresult,/*theaddressofachar**bufferwhichtoholdenquiryresult*/
int*nRow,/*Rowofsegment*/
int*nColumn,/*Columnofsegment*/
char**errmsg);/*errormessagebuffer*/
intsqlite3_close(sqlite3*db);
6事务处理
sqlite是支持事务处理的。
如果你知道你要同步删除很多数据,不仿把它们做成一个统一的事务。
通常一次sqlite3_exec就是一次事务,如果你要删除1万条数据,sqlite就做了1万次:
开始新事务->删除一条数据->提交事务->开始新事务->…的过程。
这个操作是很慢的。
因为时间都花在了开始事务、提交事务上。
你可以把这些同类操作做成一个事务,这样如果操作错误,还能够回滚事务。
事务的操作没有特别的接口函数,它就是一个普通的sql语句而已。
分别如下:
intresult;
result=sqlite3_exec(db,"begintransaction",0,0,&zErrorMsg);//开始一个事务
result=sqlite3_exec(db,"committransaction",0,0,&zErrorMsg);//提交事务
result=sqlite3_exec(db,"rollbacktransaction",0,0,&zErrorMsg);//回滚事务
7封装后的API
intdb_init(constchar*db_filepath,db_handler**db);
intdb_sql(db_handler*db,constchar*sql,char***dbresult,int*nRow,int*nColumn,char**errmsg);
intdb_term(db_handler*db,char**dbresult);
8APIdemo程序
/*test_db.c*/
#include"db.h"
intmain(intargc,char**argv)
{
db_handler*db;
intresult;
char*errmsg=NULL;
char**dbResult;
intnRow,nColumn;
inti,j;
intindex;
if(argc!
=2)
{
fprintf(stderr,"Usage:
%s\n",argv[0]);
return-1;
}
result=db_init(argv[1],&db);
if(result!
=DB_OK)
{
//failedtoopendatabase
return-1;
}
result=db_sql(db,"select*fromtable1",&dbResult,&nRow,&nColumn,&errmsg);
if(DB_OK==result)
{
//SQLoperationissuccess
//dbResult的字段值是连续的,从第0索引到第nColumn-1索引都是字段名称,从第nColumn索引开始才是字段值
index=nColumn;
printf("found%drecord\n",nRow);
for(i=0;i{
printf("record%d\n",i+1);
for(j=0;j{
printf("segmentname:
%s\t\tsegmentvalue:
%s\n",dbResult[j],dbResult[index]);
++index;
}
printf("-------\n");
}
}
db_term(db,dbResult);
return0;
}
/*Makefile*/
OBJ+=app
SRC+=db.ctest_db.c
CFLAG=-lsqlite3-L.-I.
CC=gcc
CROSS_COMPILE=ppc_8xx-
$(OBJ):
$(SRC)
$(CROSS_COMPILE)$(CC)-o$@$^$(CFLAG)
clean:
rm-rf$(OBJ)
以下是在目标板上测试的截屏:
参考资料:
[1]SQLite中文社区