09
05

SQLite-麻雀雖小五臟俱全

前一陣子寫裝置管理軟體時,曾經有考慮過使用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

  1. #! /bin/sh 
  2.  
  3. export PATH=$PATH:/usr/local/eldk/usr/bin/
  4. export CPPFLAGS="-I/usr/local/eldk/arm/usr/include" 
  5. export LDFLAGS="" 
  6. export CFLAGS="" 
  7. export AR=arm-linux-ar 
  8. export AS=arm-linux-as 
  9. export LD=arm-linux-ld 
  10. export RANLIB=arm-linux-ranlib 
  11. export CC=arm-linux-gcc 
  12. export NM=arm-linux-nm 
  13. export ARCH=arm 
  14.  
  15. ./configure --target=arm-linux \
  16. --host=arm-linux \
  17. --build=arm-linux-gnu \
  18. --prefix=/usr/local/eldk/sql \
  19. --exec-prefix=/usr/local/eldk/sql \
  20. --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:關閉資料庫
範例程式如下

  1. #include <stdio.h> 
  2. #include "../sqlite3.h" 
  3.  
  4. static int callback(void *NotUsed, int argc, char **argv, char **azColName){ 
  5. int i;
  6. for(i=0; i<argc; i++){ 
  7. printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  8. } 
  9. printf("\n");
  10. return 0;
  11. } 
  12.  
  13. int main(int argc, char **argv){ 
  14. sqlite3 *db;
  15. char *zErrMsg = 0;
  16. int rc;
  17.  
  18. if( argc!=3 ){ 
  19. fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
  20. exit(1);
  21. } 
  22. rc = sqlite3_open(argv[1], &db);
  23. if( rc ){ 
  24. fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
  25. sqlite3_close(db);
  26. exit(1);
  27. } 
  28. rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
  29. if( rc!=SQLITE_OK ){ 
  30. fprintf(stderr, "SQL error: %s\n", zErrMsg);
  31. sqlite3_free(zErrMsg);
  32. } 
  33. sqlite3_close(db);
  34. return 0;
  35. }

標籤: embedded
評論: 5 | 引用: 0 | 閱讀: 20580
  • 1 
小魔女 [ 2010-06-30 17:40 | 回覆 | 編輯 刪除 ]
感謝大大,你寫的真是清楚。
sqlite到arm板一下子就弄好了。
cses902217 [ 2010-10-12 14:44 | 回覆 | 編輯 刪除 ]
我按照方法編譯出檔案了
可是使用FTP上傳至將sqlite3傳至開發板的/bin
/lib裡的檔案也都上傳到開發板的/lib
在下命令執行sqlite3
卻發生了sqlite3: No such file or directory
請問是我漏做了甚麼嗎?
Joey [ 回復於2010-10-25 16:43 郵箱 | 編輯 刪除 ]
Do you place all library files which sqlite needs on your target board?
Please try to type "readelf -a your_sqlite_binary | more" to find out which library file is missing on the target board.
^o^ [ 回復於2011-03-04 18:56 | 編輯 刪除 ]
打指令時,忘記打分號,或者多打分號。
lin [ 2010-12-05 23:58 | 回覆 | 編輯 刪除 ]
請問編譯出來大小是多少呢?
我編譯出來的lib.a檔是800K
似乎不像官方網站所說的大小

另外您有試過限制heap(記憶體大小使用)的function嗎
我試了似乎沒有什麼效果,不清楚為何
  • 1 
發表評論
暱 稱: 密 碼:
網 址: E - mail:
驗證碼: 驗證碼圖片 選 項:
頭 像:
內 容: