您的位置:首页 > 数据库

嵌入式课程设计实践(三)——SQLite

2014-06-30 16:32 288 查看
额,课设博文已经第三篇了,还没写我的课设的大概情况,那么就在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支持多平台,因本人做课设需要,分别在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挂载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,在官网即可下载,我的网盘也可以:http://pan.baidu.com/s/1i3sXtJJ#dir

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(),有兴趣的可以去看看。

唔,排版较乱,大家就不要在意渣格式这个细节了=。=
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: