一、環境介紹
1、主機環境:ubuntu10.04
2、交叉編譯器:arm-none-linux-gnueabi-gcc-4.3.2
3、軟件包:sqlite-3.6.1.tar.bz2
4、把sqlite-3.6.1.tar.bz2解壓到主機的/opt/studyarm/SQLite-transplant目錄下,並重命名爲sqlite,在同一級目錄下在新建目錄sqlite-arm,這個目錄來放編譯後產生的文件。
二、移植步驟
1、配置SQLite
在sqlite目錄下進行如下配置:
./configure --prefix=/QT/sqlite3 --disable-tcl --host=arm-none-linux-gnueabi
2、編譯
make
3、安裝
make install
該命令將編譯好的文件安裝到sqlite-arm目錄下,在sqlite-arm目錄下會生成bin、lib、include目錄,bin目錄下是sqlite3可執行文件,lib目錄下包含運行sqlite3所依賴的庫,另外在編譯,另外在編譯sqlite應用程序時,必須指明所依賴的頭文件和庫。
4、去掉調試信息(可選)
文件編譯後會產生許多調試信息,下載到開發板將會佔用較多存儲器。我在編譯後lib目錄下文件大小達到2.2M,佔用了不少Flash,爲減小Flash佔用去掉不必要的調試信息。在sqlite_arm目錄下執行如下命令:
arm-linux-strip bin/*
arm-linux-strip lib/*
去掉調試信息後文件大小減小許多。將sqlite_arm /bin目錄下的文件sqlite3拷貝到根文件系統的bin目錄下,並將sqlite_arm/lib目錄下的文件拷貝到根文件系統的lib目錄下。
三、測試
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]# |
藍色部分爲輸入。
2、測試程序
這裏以SQLite官方站點http://sqlite.org的quick start文檔中的測試程序爲例對移植到ARM-Linux上的SQLite3進行測試。該程序清單如下:
//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, 0, &zErrMsg); if( rc!=SQLITE_OK ) { fprintf(stderr, "SQL error: %s/n", zErrMsg); } sqlite3_close(db); return 0; } |
使用如下命令編譯測試程序:
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
使用如下命令去掉調試信息:
arm-linux-strip test_sqlite
3、在上面新建的數據庫目錄下測試:
[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 , 0 , 0 , &zErrMsg );
//插入數據
sql = "INSERT INTO \"SensorData\" VALUES( NULL , 1 , 1 , '200605011206', 18.9 );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
sql = "INSERT INTO \"SensorData\" VALUES( NULL , 1 , 1 , '200605011306', 16.4 );" ;
sqlite3_exec( db , sql , 0 , 0 , &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 , sql , &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 , sql , 0 , 0 , &zErrMsg );
//釋放掉 azResult 的內存空間
sqlite3_free_table( azResult );