嵌入式課程設計實踐(三)——SQLite
額,課設博文已經第三篇了,還沒寫我的課設的大概情況,那麼就在SQLite前稍微寫一下。
一、嵌入式課程設計
題目:基於嵌入式系統的資料採集與Socket通訊系統的設計與實現
內容:利用嵌入式實驗箱CVT6410搭建嵌入式系統開發環境,進行Linux核心移植,燒寫Linux系統,編寫應用程式,完成以下功能,並撰寫嵌入式系統設計報告。:
1.通過串列埠傳輸,獲得ZigBee嵌入式閘道器採集的ZigBee感測器模組上的資訊;
2.將採集的資訊儲存到嵌入式資料庫(SQLite);
3.利用實驗箱上的RJ45網口,通過網線與PC機建立連線,並基於Linux環境下的Socket通訊方式在實驗箱與PC
前面的課設博文(一)講述了CVT6410與Linux下的開發環境的搭建過程;
課設博文(二)則簡單的介紹了C語言下對於串列埠傳輸的開發實踐。
下面將進入本博文的正題——SQLite。
二、SQLite
(一)簡介
SQLite是一款極為簡單的嵌入式關係型資料庫系統,程式碼量很少,大約13萬多點,由於其設計目標是嵌入式,所以它具有低資源消耗,高跨平臺等特性,同時,它還支援大部分的SQL語句,具有極為良好的資料庫移植性。其他的我就不多說了,總之它是個好東西。
(二)SQLite的安裝
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掛載Ubuntu的tftpboot目錄,
#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
再次強調,PC與ARM構架不同,安裝檔案不能混用,如果已經做了類似的操作,請立即改回來。我這裡將安裝最新版的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>
本段程式最重要的兩點:
1)SQL4的賦值,在使用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下。,所以需要指定forarm的sqlite庫及標頭檔案,否則編譯的檔案將會無法執行。
三、結語
關於SQLite就寫到這裡了,SQLite其實比較簡單,主要的問題在於編寫程式碼時會遇到的各種錯誤,需要去解決。本身對於C語言特別是指標與陣列不太熟,經常被搞得焦頭爛額,耗費了不少時間。希望我的博文能夠給大家帶來幫助。另外,SQLite在C語言裡的呼叫還有一種方法,不過這個方法只能進行建立資料庫和插入資料操作,不能查詢就是使用system(),有興趣的可以去看看。
唔,排版較亂,大家就不要在意渣格式這個細節了=。=