基于嵌入式linux的數(shù)據(jù)庫主要有SQLite, Firebird, Berkeley DB, eXtremeDB
這幾種數(shù)據(jù)庫的特點(diǎn):
1.Firebird是關(guān)系型數(shù)據(jù)庫,功能強(qiáng)大,支持存儲(chǔ)過程、SQL兼容等
2.SQLite關(guān)系型數(shù)據(jù)庫,體積小,支持ACID事務(wù)
3.Berkeley DB中并沒有數(shù)據(jù)庫服務(wù)器的概念,它的程序庫直接鏈接到應(yīng)用程序中
4.eXtremeDB是內(nèi)存數(shù)據(jù)庫,運(yùn)行效率高
SQLite的源代碼是C,其源代碼完全開放,是一個(gè)輕量級的嵌入式數(shù)據(jù)庫。
SQLite有以下特性:
零配置一無需安裝和管理配置;
儲(chǔ)存在單一磁盤文件中的一個(gè)完整的數(shù)據(jù)庫;
數(shù)據(jù)庫文件可以在不同字節(jié)順序的機(jī)器間自由共享;
支持?jǐn)?shù)據(jù)庫大小至2TB;
足夠小,全部源碼大致3萬行c代碼,250KB;
比目前流行的大多數(shù)數(shù)據(jù)庫對數(shù)據(jù)的操作要快;
這個(gè)數(shù)據(jù)庫操作比較簡單,首先要安裝數(shù)據(jù)庫:
這個(gè)很簡單,在//www.sqlite.org/download.html這個(gè)sqlite主頁的下載目錄中找到對應(yīng)的linux版本。下載完成后解壓,執(zhí)行里面的
configure。如圖:

執(zhí)行完之后要執(zhí)行 sudo make && make install
等待一段時(shí)間就可以安裝完成。
完成以后看一下我們sqlite3的執(zhí)行文件的路徑在哪里如圖:

在/usr/local/bin目錄里。
為了以后的方便,可以將該目錄加入到環(huán)境變量里,先打開 sudo vim /environment 將路徑加入到這里,如何將sqlite3 移植到開發(fā)板上呢?
1、去掉/root/sqlite3.3.6目錄下的sqlite3的調(diào)示信息:(俗稱瘦身)
#arm-linux-strip sqlite3
2、將sqlite3下載到開發(fā)板的/usr/bin目錄:
在PC機(jī)的目錄/usr/lib 中找到libsqlite3.so.0、libsqlite3.so.0.8.6這兩個(gè)庫文件,去掉調(diào)示信息后把它們復(fù)制到開發(fā)板的/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的目的是將源庫拷貝,千萬別只拷貝個(gè)鏈接,那么就悲劇了。。。
經(jīng)過以上步驟,開發(fā)板上就已經(jīng)有了sqlite數(shù)據(jù)庫。
sqlite的一些基本操作可以在網(wǎng)上找一下,SQL語句都是通用的,所以比較重要的是sqlite3特供的一些操作數(shù)據(jù)庫的接口:
int sqlite3_open(char *path, sqlite3 **db);
功能:打開sqlite數(shù)據(jù)庫
path: 數(shù)據(jù)庫文件路徑
db: 指向sqlite句柄的指針
返回值:成功返回0,失敗返回錯(cuò)誤碼(非零值)
int sqlite3_close(sqlite3 *db);
功能:關(guān)閉sqlite數(shù)據(jù)庫
返回值:成功返回0,失敗返回錯(cuò)誤碼
const char *sqlite3_errmg(sqlite3 *db);
返回值:返回錯(cuò)誤信息
gcc -o test test.c -lsqlite3
}
回調(diào)函數(shù)的定義:
typedef int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name);
}
功能:每找到一條記錄自動(dòng)執(zhí)行一次回調(diào)函數(shù)
para:傳遞給回調(diào)函數(shù)的參數(shù)
f_num:記錄中包含的字段數(shù)目
f_value:包含每個(gè)字段值的指針數(shù)組
f_name:包含每個(gè)字段名稱的指針數(shù)組
返回值:成功返回0,失敗返回-1
int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *, char **errmsg);
功能:執(zhí)行SQL操作
db:數(shù)據(jù)庫句柄
sql:SQL語句
callback:回調(diào)函數(shù)
errmsg:錯(cuò)誤信息指針的地址
返回值:成功返回0,失敗返回錯(cuò)誤碼
例如:定義一個(gè)回調(diào)函數(shù),打印記錄中所有字段的名稱和值
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);
}
……
不使用回調(diào)函數(shù)執(zhí)行SQL語句
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int*nrow, int *ncolumn, char **errmsg);
函數(shù)功能:執(zhí)行SQL操作
函數(shù)參數(shù):
db:數(shù)據(jù)庫句柄
sql:SQL語句
resultp:用來指向sql執(zhí)行結(jié)果的指針
nrow:滿足條件的記錄的數(shù)目
ncolumn:每條記錄包含的字段數(shù)目
errmsg:錯(cuò)誤信息指針的地址
返回值:成功返回0,失敗返回錯(cuò)誤碼
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; // 第一條記錄的第一個(gè)字段的下標(biāo)
for (i=0; i< nrow; i++)
{
for (j=0; j< ncolumn; j++)
{
printf("%s : %s\n", resultp[j], resultp[index++]);
}
}
有了這幾個(gè)函數(shù),數(shù)據(jù)庫的操作就基本上OK了.