1. 程式人生 > >嵌入式課程設計實踐(三)——SQLite

嵌入式課程設計實踐(三)——SQLite

額,課設博文已經第三篇了,還沒寫我的課設的大概情況,那麼就在SQLite前稍微寫一下。

一、嵌入式課程設計

題目:基於嵌入式系統的資料採集與Socket通訊系統的設計與實現

內容:利用嵌入式實驗箱CVT6410搭建嵌入式系統開發環境,進行Linux核心移植,燒寫Linux系統,編寫應用程式,完成以下功能,撰寫嵌入式系統設計報告。:

 1.通過串列埠傳輸,獲得ZigBee嵌入式閘道器採集的ZigBee感測器模組上的資訊;

 2.將採集的資訊儲存到嵌入式資料庫(SQLite);

 3.利用實驗箱上的RJ45網口,通過網線與PC機建立連線,並基於Linux環境下的Socket通訊方式在實驗箱與PC

機間傳遞資料,顯示採集的資訊。

      前面的課設博文(一)講述了CVT6410Linux下的開發環境的搭建過程;

      課設博文(二)則簡單的介紹了C語言下對於串列埠傳輸的開發實踐。

      下面將進入本博文的正題——SQLite

二、SQLite

(一)簡介

      SQLite是一款極為簡單的嵌入式關係型資料庫系統,程式碼量很少,大約13萬多點,由於其設計目標是嵌入式,所以它具有低資源消耗,高跨平臺等特性,同時,它還支援大部分的SQL語句,具有極為良好的資料庫移植性。其他的我就不多說了,總之它是個好東西。

(二)SQLite的安裝

      SQLite支援多平臺,因本人做課設需要,分別在

CVT6410以及Ubuntu上都裝了SQLite,由於兩系統基礎構架不同,故需要使用不同的安裝方式。

1.SQLitefor ARM

      SQLite自帶支援ARM的編譯安裝方式,有興趣的可以自行前往官網瞭解,問度娘也可。我這裡為了簡單就選用了別人移植好的安裝包了,版本為sqlite-3.5.9,軟體下載地址:http://pan.baidu.com/s/1i3sXtJJ#dir

將軟體放在你希望放在的地方,我的檔案存放路徑為:/home/wzg/6410/sqlite-3.5.9.tar.gz

      下面就正式開始安裝了:(終端下操作)

1.1進入sqlite所在目錄,#cd /home/wzg/6410/

1.2解壓檔案,#tar xzvf sqlite-3.5.9.tar.gz

1.3進入解壓出來的資料夾,#cdsqlite-3.5.9

1.4由於這是別人移植的,所以使用別人寫的命令,#./build

1.5經過一段時間的編譯,會在目錄下生成一個資料夾“_install”,進入該資料夾,#cd _install

1.6輸入ls命令,會看到三個目錄:bin、include、lib

      三個目錄中,bin裡面是sqlite3的程式檔案,include裡是sqlite的標頭檔案,lib裡的是sqlite的庫檔案,需要分別複製到CVT6410系統的/bin/include/lib目錄下。由於程式編譯於Ubuntu下,還需要以下幾步。

1.7繼續在該目錄下輸入,#cp -R * /tftpboot (此時三資料夾都複製到了tftpboot目錄下了)

1.8進入minicom(超級終端),#sudo minicom

1.96410掛載Ubuntutftpboot目錄,

#mount 192.168.1.12:/tftpboot(空格)/mnt-o nolock

1.10進入mnt目錄,#cd /mnt (ls檢視三個資料夾是否存在)

1.11分別輸入三條命令

#cp bin/* /bin

#cp include/* /include

#cp -R lib/* /lib

1.12執行完畢則sqlite安裝結束。

2.SQLitefor Ubuntu

      再次強調,PCARM構架不同,安裝檔案不能混用,如果已經做了類似的操作,請立即改回來。我這裡將安裝最新版的sqlite,在官網即可下載,我的網盤也可以:

sqlite的名字是sqlite-autoconf-3080500.tar.gz

2.1下載sqlite,放在某個目錄下,我依然是/home/wzg/6410/***(名略)

2.2進入該目錄,#cd /home/wzg/6410

2.3解壓檔案,#tar xzvfsqlite-autoconf-3080500.tar.gz

2.4進入檔案,#cd sqlite-autoconf-3080500

下面是軟體的常規安裝方法:

2.5# ./configure

2.6# make

2.7# make install

一切正常則安裝成功,下面可以體驗SQLite了。

(三)使用SQLite

      本小節主要內容為在終端下使用SQLite的操作。

      方法一:輸入sqlite3回車,進入SQLite的互動操作模式,直接輸入SQL語句即可,幫助(.help),退出   (.quit/.exit)。

      方法二:輸入完整的命令,具體的在後面呈現。

1.建立資料庫與表

#sqlite3 database.db “create table tb1(name varchar(10),ageinteger);”

2.插入資料

#sqlite3 database.db “insert into tb1 values(“wzg”,22);”

3.查詢資料

#sqlite3 database.db “select * from tb1;”

將按如下顯示:

wzg|22

SQLite的基本演示就這麼多了,更多的自己去探索吧~

(四)C語言下對SQLite的操作

      使用SQLite不可能只是在終端下使用,更多的是需要在c語言中進行呼叫、使用。下面我以一個例子來演示如何在C語言下使用SQLite

sqlite.c

<span style="font-size:14px;">#include<stdio.h>

#include<sqlite3.h>

intselect_callback(void *data,int col_count,char **col_values,char**col_name)

{

//每條記錄回撥一次該函式,有多少條就回調多少次

inti;

for(i=0;i<col_count;i++)

{

printf("%s=%s\n",col_name[i],col_values[i]==0?"NULL":col_values[i]);

}

return0;

}

intmain(int argc,char **argv)

{

intk=20;

//建立資料庫表

constchar *SQL1="CREATE TABLE IF NOT EXISTS users1(cc2530tempint,boardtemp int,temperature
                    int,humidity int,light_lowint,light_high int);";

//向資料庫插入資料

constchar *SQL2="insert into users1 values(11,1,11,11,11,11);";

constchar *SQL3="insert into users1 values(11,1,11,11,11,22);";

constchar SQL4[50];

sprintf(SQL4,"insertinto users1 values(22,22,22,22,22,%d);",k);

//從資料庫查詢資料

constchar *SQL5="select * from users1;";

char*ErrMsg=0;

int ret = 0;

//連線資料庫

sqlite3*db =0;

ret=sqlite3_open("./DataBase.db",&db);

if(ret!= SQLITE_OK)

{

fprintf(stderr,"無法開啟資料庫:%s",sqlite3_errmsg(db));

return1;

}

printf("資料庫連線成功!\n");

//執行建表

ret= sqlite3_exec(db,SQL1,0,0,&ErrMsg);

if(ret!= SQLITE_OK)

{

fprintf(stderr,"SQLError:%s\n",ErrMsg);

sqlite3_free(ErrMsg);

}

//執行插入記錄SQL語句

ret= sqlite3_exec(db,SQL2,0,0,&ErrMsg);

if(ret==SQLITE_OK)

{

printf("插入資料1成功\n");

}

ret= sqlite3_exec(db,SQL3,0,0,&ErrMsg);

if(ret==SQLITE_OK)

{

printf("插入資料2成功\n");

}

ret= sqlite3_exec(db,SQL4,0,0,&ErrMsg);

if(ret==SQLITE_OK)

{

printf("插入資料3成功\n");

}

//查詢資料表內容

printf("查詢資料表內容\n");

sqlite3_exec(db,SQL5,select_callback,0,&ErrMsg);

//關閉資料庫

sqlite3_close(db);

db= 0;

printf("資料庫關閉成功!\n");

return0;

}</span>


本段程式最重要的兩點:

      1SQL4的賦值,在使用sprintf()時,一定注意宣告為陣列形式,不要指標,在ARM裡執行時會出錯(段錯誤/Segmentation fault

      2)在使用回撥函式時(call_back()),一定要注意形參的資料型別,否則會編譯警告,執行的結果也會出乎意料。比如要對col_values[i]進行賦值操作,建議考慮類似char*col_values[]的形式,否則因為傳遞的是指標而產生錯誤的賦值。

下面放出編譯命令:

ForPC

#gccsqlite.c -o sqlite -lsqlite3

ForARM

#arm-linux-gccsqlite.c -o sqlite -I/home/wzg/6410/sqlite-3.5.9/_install/include-L/home/wzg/6410/sqlite-3.5.9/_install/lib -lsqlite3

//對於arm的要解釋一下,因為編譯環境是在Ubuntu下。,所以需要指定forarmsqlite庫及標頭檔案,否則編譯的檔案將會無法執行。

三、結語

關於SQLite就寫到這裡了,SQLite其實比較簡單,主要的問題在於編寫程式碼時會遇到的各種錯誤,需要去解決本身對於C語言特別是指標與陣列不太熟,經常被搞得焦頭爛額,耗費了不少時間。希望我的博文能夠給大家帶來幫助。另外,SQLiteC語言裡的呼叫還有一種方法,不過這個方法只能進行建立資料庫和插入資料操作,不能查詢就是使用system(),有興趣的可以去看看。

唔,排版較亂,大家就不要在意渣格式這個細節了=。=