简单讲解:linux内核数据库sqlite3的移植
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2015年已经有15个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
本篇文章就是简单做一个讲解:linux内核数据库sqlite3的移植。据我所知,目前很多人都需要这个教程,所以请往下看。
基于嵌入式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(\for (i=0; i< f_num; i++) {
printf(\} return 0; }
sqlite3 *db; char *errmsg; ……
if (sqlite3_exec(db, \{
printf(\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, \{
printf(\exit(-1); }
index = ncolumn; // 第一条记录的第一个字段的下标 for (i=0; i< nrow; i++) {
for (j=0; j< ncolumn; j++)
{
printf(\} }
有了这几个函数,数据库的操作就基本上OK了。
以上内容就是简单讲解linux内核数据库sqlite3的移植,看完后是否获益匪浅呢?如果需要更多学习教程和资料,可以在华清远见官网获得,华清远见提供免费的学习课程,供大家学习和参考。