国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

當(dāng)前位置: > 華清遠(yuǎn)見(jiàn)教育科技集團(tuán) > 嵌入式學(xué)習(xí) > 講師博文 > linux內(nèi)核數(shù)據(jù)庫(kù)sqlite3的移植和簡(jiǎn)單操作
linux內(nèi)核數(shù)據(jù)庫(kù)sqlite3的移植和簡(jiǎn)單操作
時(shí)間:2016-12-12作者:華清遠(yuǎn)見(jiàn)

基于嵌入式linux的數(shù)據(jù)庫(kù)主要有SQLite, Firebird, Berkeley DB, eXtremeDB

這幾種數(shù)據(jù)庫(kù)的特點(diǎn):

1.Firebird是關(guān)系型數(shù)據(jù)庫(kù),功能強(qiáng)大,支持存儲(chǔ)過(guò)程、SQL兼容等
        2.SQLite關(guān)系型數(shù)據(jù)庫(kù),體積小,支持ACID事務(wù)
        3.Berkeley DB中并沒(méi)有數(shù)據(jù)庫(kù)服務(wù)器的概念,它的程序庫(kù)直接鏈接到應(yīng)用程序中
        4.eXtremeDB是內(nèi)存數(shù)據(jù)庫(kù),運(yùn)行效率高

SQLite的源代碼是C,其源代碼完全開(kāi)放,是一個(gè)輕量級(jí)的嵌入式數(shù)據(jù)庫(kù)。

SQLite有以下特性:
        零配置一無(wú)需安裝和管理配置;
        儲(chǔ)存在單一磁盤文件中的一個(gè)完整的數(shù)據(jù)庫(kù);
        數(shù)據(jù)庫(kù)文件可以在不同字節(jié)順序的機(jī)器間自由共享;
        支持?jǐn)?shù)據(jù)庫(kù)大小至2TB;
        足夠小,全部源碼大致3萬(wàn)行c代碼,250KB;
        比目前流行的大多數(shù)數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)的操作要快;
        這個(gè)數(shù)據(jù)庫(kù)操作比較簡(jiǎn)單,首先要安裝數(shù)據(jù)庫(kù):

這個(gè)很簡(jiǎn)單,在//www.sqlite.org/download.html這個(gè)sqlite主頁(yè)的下載目錄中找到對(duì)應(yīng)的linux版本。下載完成后解壓,執(zhí)行里面的 configure。如圖:


執(zhí)行完之后要執(zhí)行 sudo make && make install

等待一段時(shí)間就可以安裝完成。

完成以后看一下我們sqlite3的執(zhí)行文件的路徑在哪里如圖:


在/usr/local/bin目錄里。

為了以后的方便,可以將該目錄加入到環(huán)境變量里,先打開(kāi) sudo vim /environment 將路徑加入到這里,如何將sqlite3 移植到開(kāi)發(fā)板上呢?

1、去掉/root/sqlite3.3.6目錄下的sqlite3的調(diào)示信息:(俗稱瘦身)
#arm-linux-strip sqlite3

2、將sqlite3下載到開(kāi)發(fā)板的/usr/bin目錄:
        在PC機(jī)的目錄/usr/lib 中找到libsqlite3.so.0、libsqlite3.so.0.8.6這兩個(gè)庫(kù)文件,去掉調(diào)示信息后把它們復(fù)制到開(kāi)發(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的目的是將源庫(kù)拷貝,千萬(wàn)別只拷貝個(gè)鏈接,那么就悲劇了。。。

經(jīng)過(guò)以上步驟,開(kāi)發(fā)板上就已經(jīng)有了sqlite數(shù)據(jù)庫(kù)。 sqlite的一些基本操作可以在網(wǎng)上找一下,SQL語(yǔ)句都是通用的,所以比較重要的是sqlite3特供的一些操作數(shù)據(jù)庫(kù)的接口:

int sqlite3_open(char *path, sqlite3 **db);
        功能:打開(kāi)sqlite數(shù)據(jù)庫(kù)
        path: 數(shù)據(jù)庫(kù)文件路徑
        db: 指向sqlite句柄的指針
        返回值:成功返回0,失敗返回錯(cuò)誤碼(非零值)

int sqlite3_close(sqlite3 *db);
        功能:關(guān)閉sqlite數(shù)據(jù)庫(kù)
        返回值:成功返回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ù)庫(kù)句柄
        sql:SQL語(yǔ)句
        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語(yǔ)句
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ù)庫(kù)句柄
        sql:SQL語(yǔ)句
        resultp:用來(lái)指向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ù)庫(kù)的操作就基本上OK了.

發(fā)表評(píng)論
評(píng)論列表(網(wǎng)友評(píng)論僅供網(wǎng)友表達(dá)個(gè)人看法,并不表明本站同意其觀點(diǎn)或證實(shí)其描述)