1. <track id="ob6no"><strike id="ob6no"><tt id="ob6no"></tt></strike></track>

      <track id="ob6no"></track>

      當前位置: > 華清遠見教育集團 > 嵌入式學習 > 講師博文 > 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了.

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