前一陣子寫裝置管理軟體時,曾經有考慮過使用SQLite這個database,因為它的優點是簡單易用,體積小(56k),記憶體使用量少(100多k),所以我曾經寫一堆wrapper API,把它封裝成方便工程師呼叫的函式,不過後來因為效能和系統整合的考量,又寫了另外一套管理的軟體取代掉先前寫的東西,其實自從離開學校開始工作後,幾乎一個程式都會寫好幾個版本互相比較效能,看看有沒有一個time complexity 和space complexity的平衡點,所以我覺的在學校演算法的基礎要打好一點,ACM多玩一點,對自己幫助很多,不過最好的是能碰到功力高強的同學一起切磋,進步幅度會很快

真是抱歉講了一廢話,因為SQLite的使用實在太簡單了,連它的C API也很簡潔,所以我只好寫些東西充版面,在編譯前先執行cross compile shell script, cross compile shell script範例如下,toolchain也是用ELDK

#! /bin/sh 
 
export PATH=$PATH:/usr/local/eldk/usr/bin/
export CPPFLAGS="-I/usr/local/eldk/arm/usr/include" 
export LDFLAGS="" 
export CFLAGS="" 
export AR=arm-linux-ar 
export AS=arm-linux-as 
export LD=arm-linux-ld 
export RANLIB=arm-linux-ranlib 
export CC=arm-linux-gcc 
export NM=arm-linux-nm 
export ARCH=arm 
 
./configure --target=arm-linux \
--host=arm-linux \
--build=arm-linux-gnu \
--prefix=/usr/local/eldk/sql \
--exec-prefix=/usr/local/eldk/sql \
--disable-tcl

編譯完後,把.libs資料夾下的library和binary丟到板子上的/lib和/bin資料夾,記得要補上libdl和libphread這兩個library,執行SQLite會出現如下界面,這邊你可以下SQL command或其它特殊的指令,網路上有一篇文章講到大概的用法,請參考試用

而它提供的C API分為下面三組
(1) sqlite3_open:打開資料庫
(2) sqlite3_exec:執行SQL指令
(3) sqlite3_close:關閉資料庫

範例程式如下

#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]);
exit(1);
} 
rc = sqlite3_open(argv[1], &db);
if( rc ){ 
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
} 
rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
if( rc!=SQLITE_OK ){ 
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} 
sqlite3_close(db);
return 0;
}
最後修改日期: 3 6 月, 2022

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。