一、环境介绍@H_301_1@
1、主机环境:ubuntu10.04@H_301_1@
2、交叉编译器:@H_301_1@arm-none-linux-gnueabi-gcc-4.3.2
3、软件包:@H_301_1@sqlite-3.6.1.tar.bz2
4、把@H_301_1@sqlite-3.6.1.tar.bz2解压到主机的@H_301_1@/opt/studyarm/sqlite-transplant目录下,并重命名为@H_301_1@sqlite,在同一级目录下在新建目录@H_301_1@sqlite-arm,这个目录来放编译后产生的文件。@H_301_1@
二、移植步骤@H_301_1@
在@H_301_1@sqlite目录下进行如下配置:@H_301_1@
./configure --prefix=/QT/sqlite3 --disable-tcl --host=arm-none-linux-gnueabi
@H_301_1@
2、编译@H_301_1@
make
3、安装@H_301_1@
make install
该命令将编译好的文件安装到@H_301_1@sqlite-arm目录下,在@H_301_1@sqlite-arm目录下会生成@H_301_1@bin、@H_301_1@lib、@H_301_1@include目录,@H_301_1@bin目录下是@H_301_1@sqlite3可执行文件,@H_301_1@lib目录下包含运行@H_301_1@sqlite3所依赖的库,另外在编译,另外在编译@H_301_1@sqlite应用程序时,必须指明所依赖的头文件和库。@H_301_1@
4、去掉调试信息@H_301_1@(可选@H_301_1@)
文件编译后会产生许多调试信息,下载到开发板将会占用较多存储器。我在编译后@H_301_1@lib目录下文件大小达到@H_301_1@2.2M,占用了不少@H_301_1@Flash,为减小@H_301_1@Flash占用去掉不必要的调试信息。在@H_301_1@sqlite_arm目录下执行如下命令:@H_301_1@
arm-linux-strip bin/*
arm-linux-strip lib/*
去掉调试信息后文件大小减小许多。将@H_301_1@sqlite_arm /bin目录下的文件@H_301_1@sqlite3拷贝到根文件系统的@H_301_1@bin目录下,并将@H_301_1@sqlite_arm/lib目录下的文件拷贝到根文件系统的@H_301_1@lib目录下。@H_301_1@
三、测试@H_301_1@
[rootMrFeng]#sqlite3 test.db sqlite version 3.6.18 Enter ".help" for instructions Enter sql statements terminated with a ";" sqlite> create table film (number,name); sqlite> insert into film values (1,'aaa'); sqlite> insert into film values (2,'bbb'); sqlite> select * from film; 1|aaa 2|bbb sqlite>.quit [rootMrFeng]# |
蓝色部分为输入。@H_301_1@
2、测试程序@H_301_1@
这里以@H_301_1@sqlite官方站点@H_301_1@http://sqlite.org的@H_301_1@quick start文档中的测试程序为例对移植到@H_301_1@ARM-Linux上的@H_301_1@sqlite3进行测试。该程序清单如下:@H_301_1@
//test_sqlite.c #include <stdio.h> #include <sqlite3.h> static int callback(void *NotUsed,int argc,char **argv,char **azColName) { int i; for(i=0; i<argc; i++) { printf("%s = %s/n",azColName[i],argv[i] ? argv[i] : "NULL"); } printf("/n"); return 0; } int main(int argc,char **argv) { sqlite3 *db; char *zErrMsg = 0; int rc; if( argc!=3 ) { fprintf(stderr,"Usage: %s DATABASE sql-STATEMENT/n",argv[0]); } rc = sqlite3_open(argv[1],&db); if( rc ) { fprintf(stderr,"Can't open database: %s/n",sqlite3_errmsg(db)); sqlite3_close(db); } rc = sqlite3_exec(db,argv[2],callback,&zErrMsg); if( rc!=sqlITE_OK ) { fprintf(stderr,"sql error: %s/n",zErrMsg); } sqlite3_close(db); return 0; } |
使用如下命令编译测试程序:@H_301_1@
arm-linux-gcc -o test_sqlite test_sqlite.c -lsqlite3 -L/opt/studyarm/sqlite-transplant/sqlite_arm/lib -I/opt/studyarm/sqlite-transplant/sqlite_arm/include
使用如下命令去掉调试信息:@H_301_1@
arm-linux-strip test_sqlite
[rootMrFeng]#./test_sqlite test.db "select * from film"
number = 1
name = aaa
number = 2
name = bbb
[rootMrFeng]#
四、使用
下面是常用的指令:
sqlite3 *db=NULL;
char *zErrMsg = 0;//提示信息
int rc;
//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
rc = sqlite3_open("zieckey.db",&db);
//关闭
sqlite3_close(db);
//创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中
char *sql = " CREATE TABLE SensorData( ID INTEGER PRIMARY KEY,SensorID INTEGER,SiteNum INTEGER,Time VARCHAR(12),SensorParameter REAL);" ;
sqlite3_exec( db,sql,&zErrMsg );
//插入数据
sql = "INSERT INTO \"SensorData\" VALUES( NULL,1,'200605011206',18.9 );" ;
sqlite3_exec( db,&zErrMsg );
sql = "INSERT INTO \"SensorData\" VALUES( NULL,'200605011306',16.4 );" ;
sqlite3_exec( db,&zErrMsg );
//查询数据
/*
int sqlite3_get_table(sqlite3*,const char *sql,char***result,int *nrow,int *ncolumn,char **errmsg );
result中是以数组的形式存放你所查询的数据,首先是表名,再是数据。
nrow,ncolumn分别为查询语句返回的结果集的行数,列数,没有查到结果时返回0
*/
int nrow = 0,ncolumn = 0;
char **azResult; //二维数组存放结果
sql = "SELECT * FROM SensorData ";
sqlite3_get_table( db,&azResult,&nrow,&ncolumn,&zErrMsg );
int i = 0 ;
printf( "row:%d column=%d \n",nrow,ncolumn );
printf( "\nThe result of querying is : \n" );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
printf( "azResult[%d] = %s\n",i,azResult );
//删除数据
sql = "DELETE FROM SensorData WHERE SensorID = 1 ;" ;
sqlite3_exec( db,&zErrMsg );
//释放掉 azResult 的内存空间
sqlite3_free_table( azResult );