• <code id="zjelh"></code>

          <source id="zjelh"><form id="zjelh"></form></source><acronym id="zjelh"><form id="zjelh"><blockquote id="zjelh"></blockquote></form></acronym>

          1. <acronym id="zjelh"><form id="zjelh"></form></acronym>

            <input id="zjelh"><rt id="zjelh"></rt></input>
            <var id="zjelh"><rt id="zjelh"></rt></var>
            <source id="zjelh"><form id="zjelh"><del id="zjelh"></del></form></source>
            當前位置: > 華清遠見教育集團 > 嵌入式學習 > 講師博文 > linux內核數據庫sqlite3的移植和簡單操作
            linux內核數據庫sqlite3的移植和簡單操作
            時間:2016-12-12作者:華清遠見

            基于嵌入式linux的數據庫主要有SQLite, Firebird, Berkeley DB, eXtremeDB

            這幾種數據庫的特點:

            1.Firebird是關系型數據庫,功能強大,支持存儲過程、SQL兼容等
                    2.SQLite關系型數據庫,體積小,支持ACID事務
                    3.Berkeley DB中并沒有數據庫服務器的概念,它的程序庫直接鏈接到應用程序中
                    4.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了.

            發表評論
            評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
            yy4480影院