基於嵌入式linux的資料庫主要有SQLite, Firebird, Berkeley DB, eXtremeDB 這幾種資料庫的特點: •Firebird是關係型資料庫,功能強大,支援預存程序、SQL相容等•SQLite關係型資料庫,體積小,支援ACID事務•Berkeley DB中並沒有資料庫伺服器的概念,它的程式庫直接連結到應用程式中•eXtremeDB是記憶體資料庫,運行效率高 SQLite的原始碼是C,其原始碼完全開放,是一個輕量級的嵌入式資料庫。 SQLite有以下特性:
零配置一無需安裝和管理配置;
儲存在單一磁碟檔案中的一個完整的資料庫;
資料庫檔案可以在不同位元組順序的機器間自由共用;
支援資料庫大小至2TB;
足夠小,全部源碼大致3萬行c代碼,250KB;
比目前流行的大多數資料庫對資料的操作要快;
這個資料庫操作比較簡單,首先要安裝資料庫:
這個很簡單,在http://www.sqlite.org/download.html這個sqlite首頁的下載目錄中找到對應的linux版本。下載完成後解壓,執行裡面的
configure。
執行完之後要執行 sudo make && make install
等待一段時間就可以安裝完成。
完成以後看一下我們sqlite3的執行檔案的路徑在哪裡
在/usr/local/bin目錄裡。
為了以後的方便,可以將該目錄加入到環境變數裡,先開啟 sudo vim /environment 將路徑加入到這裡,如何將sqlite3 移植到開發板上呢?
1、去掉/root/sqlite3.3.6目錄下的sqlite3的調示資訊:(俗稱瘦身)
#arm-linux-strip sqlite3
2、將sqlite3下載到開發板的/usr/bin目錄:
在PC機的目錄/usr/lib 中找到libsqlite3.so.0、libsqlite3.so.0.8.6這兩個庫檔案,去掉調示資訊後把它們複製到開發板的/usr/lib目錄下:
arm-linux-strip libsqlite3.so.0 (/home/linux/sqlite/lib)
arm-linux-strip libsqlite3.so.0.8.6 (/home/linux/sqlite/lib)
cp –arf libsqlite3.so.0 libsqlite3.so.0.8.6 /usr/lib 加上arf的目的是將源庫拷貝,千萬別只拷貝個連結,那麼就悲劇了。。。
經過以上步驟,開發板上就已經有了sqlite資料庫。
sqlite的一些基本操作可以在網上找一下,SQL語句都是通用的,所以比較重要的是sqlite3特供的一些操作資料庫的介面:
int sqlite3_open(char *path, sqlite3 **db);
功能:開啟sqlite資料庫
path: 資料庫檔案路徑
db: 指向sqlite控制代碼的指標
傳回值:成功返回0,失敗返回錯誤碼(非零值)
int sqlite3_close(sqlite3 *db);
功能:關閉sqlite資料庫
傳回值:成功返回0,失敗返回錯誤碼
const char *sqlite3_errmg(sqlite3 *db);
傳回值:返回錯誤資訊
gcc -o test test.c -lsqlite3
}回呼函數的定義:typedef int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name);}
功能:每找到一條記錄自動執行一次回呼函數
para:傳遞給回呼函數的參數
f_num:記錄中包含的欄位數目
f_value:包含每個欄位值的指標數組
f_name:包含每個欄位名稱的指標數組
傳回值:成功返回0,失敗返回-1
int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *, char **errmsg);
功能:執行SQL操作
db:資料庫控制代碼
sql:SQL語句
callback:回呼函數
errmsg:錯誤資訊指標的地址
傳回值:成功返回0,失敗返回錯誤碼
例如:定義一個回呼函數,列印記錄中所有欄位的名稱和值
int callback(void *para, intf_num, char **f_value, char **f_name){ int i; printf(“*****************************\n”); for (i=0; i<f_num; i++) { printf(“%s : %s\n”, f_name[i], f_value[i]); } return 0;}
sqlite3 *db;char *errmsg; ……if (sqlite3_exec(db, “select * from table”, callback, NULL, &errmsg) != SQLITE_OK){ printf(“error : %s\n”, errmsg); exit(-1); } ……
不使用回呼函數執行SQL語句int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int*nrow, int *ncolumn, char **errmsg);函數功能:執行SQL操作
函數參數:
db:資料庫控制代碼
sql:SQL語句
resultp:用來指向sql執行結果的指標
nrow:滿足條件的記錄的數目
ncolumn:每條記錄包含的欄位數目
errmsg:錯誤資訊指標的地址
傳回值:成功返回0,失敗返回錯誤碼
sqlite3 *db;char *errmsg,**resultp;int nrow, ncolumn, i, j, index; ……if (sqlite3_exec(db, “select * from table”, &resultp, &nrow, &ncolumn, &errmsg) != SQLITE_OK){ printf(“error : %s\n”, errmsg); exit(-1); }index = ncolumn; // 第一條記錄的第一個欄位的下標 for (i=0; i<nrow; i++){ for (j=0; j<ncolumn; j++) { printf(“%s : %s\n”, resultp[j], resultp[index++]); }}
有了這幾個函數,資料庫的操作就基本上OK了。