Berkeley DB不是关系型的数据库,不能应用标准的SQL语句对数据库操作,对它的操作要调用专用的API实现。这些API提供了查询、插入、删除等功能。使用Berkeley DB提供的函数来进行数据库的访问和管理并不复杂。在大多数场合下,只需按照统一的接口标准进行调用就可以完成最基本的操作。
2、 存储方式及模式
SQLite只提供了Btree存储数据的模式。对二进制数据,SQLite不能直接保存;但可以先将二进制的数据转换成ASCII编码,然后再保存。Base64编码机制是最常见的把二进制数据转换成ASCII编码的手段。在SQLite的C语言代码encode.c中,提供了Base64编码的功能。
Berkeley DB对任何存入的数据都是按原样直接存储到数据文件中去,无论其是二进制数据还是ASCII或Unicode等编码的文本。Berkeley DB提供了四种存储数据的模式:Btree、Hash、Queue和Recno。在打开数据库的时候,要指定一种存储模式。
对于以上各种存储模式的具体定义、优缺点、及适用范围,由于篇幅有限,在此就不过多叙述,如有需要可参阅相关资料。
3、 数据类型
SQLite最大的特点在于其数据类型为无数据类型(typelessness)。这意味着可以保存任何类型的数据到所想要保存的任何表的任何列中,无论这列声明的数据类型是什么。虽然在生成表结构的时候,要声明每个域的数据类型,但SQLite并不做任何检查。开发人员要靠自己的程序来控制输入与读出数据的类型。这里有一个例外,就是当主键为整型值时,如果要插入一个非整型值时会产生异常。
虽然,SQLite允许忽略数据类型,但是,仍然建议在Create Table语句中指定数据类型,因为数据类型有利于增强程序的可读性。另外,虽然在插入或读出数据的时候是不区分类型的,但在比较的时候,不同数据类型是有区别的。
在Berkeley DB中关键字(key)和数据(data)是用来进行数据库管理的基础,由这两者构成的key/data对,组成了数据库中的一个基本结构单元。通过使用这种方式,用API函数访问数据库时,只需提供关键字就能够访问到相应的数据。关键字和数据在Berkeley DB中都是用一个名为DBT的简单结构来表示的,它的作用主要是保存相应的内存地址及其长度。
5 应用
SQLite嵌入式数据库提供了以源码发布的方式,要在众多的硬件平台进行移植,可以根据不同平台对源码进行交叉编译来实现。编译主要有以下几个步骤:
1、到的cvs中下载最新的源代码包,解压后将生成sqlite目录,另外新建并转到一个与sqlite目录平行的同级目录,如make目录。
2、用“echo$PATH”命令查看PATH中是否已经包含交叉编译工具arm-linux-gcc。
3、为了在ARM-Linux下能正常运行sqlite,需要对sqlite/src/sqliteInt.h作一定的修改,以确保btree(B树)有正确的变量大小,如“ptr”和“char”。不同体系结构的Linux,如X86和ARM,会有些差别。对于ARM-Linux可以找到如下部分:
# ifndef INTPTR_TYPE
# if SQLITE_PTR_SZ==4
# define INTPTR_TYPE int
# else
# define INTPTR_TYPE long long
# endif
在上面的代码前加上一句
# define SQLITE_PTR_SZ 4
这样后面的“typedef INTPTR_TYPE ptr;”就是定义的“int”类型,而不是“long long”。
4、使用configure进行一些配置。修改sqlite目录下的configure,让configure不去检查交叉编译环境。由于篇幅有限不再详述。
5、修改Makefile文件。将代码行BCC=arm-linux-gcc-g-O2改成BCC=gcc-g-O2。另外,一般是以静态链接的形式将sqlite放到ARM-Linux的硬件板上运行的,所以继续修改Makefile,找到标记为sqlite:的代码段,将其中的libsqlite.la改成.libs/libsqlite.a。做完上述修改,用make生成sqlite、libsqlite.a、libsqlite.so。为了减小执行文件大小可以用strip处理,去掉其中的调试信息。
6、在ARM板上运行sqlite。将sqlite拷贝到ARM板上,方法很多,需要根据具体的情况来选择。如ftp、cm-dftp、wget等。将sqlite下载到ARM板的/tmp目录,因为此目录是可写的。修改权限并运行:
chmod+wx sqlite
./sqlite test.sqlite
会出现
sqlite>
如果一切正常,现在sqlite已经在ARM-Linux下跑了起来,然后就可以基于此进行下一步的应用开发了。
6 结语
嵌入式数据库SQLite和Berkeley DB,在体积上、功能上、运行速度及难易程度都存在着或多或少的异同。但它们都有能够充分适应硬件的能力,能很好地适应嵌入式系统的需要。就笔者来看,SQLite功能虽不及Berkeley DB强大,但它的设计思想是小型、快速和最小化的管理。这就使得SQLite在大小和功能之间找到了一个理想的平衡点,而且完全的开源代码使其可以称得上是理想的“嵌入式数据库”。当然在具体的嵌入式应用中可以根据具体情况选择应用。
参考文献:
1、 , SQLite的官方主页
2、 ,Berkeley DB的官方主页
3、Michael Owens. Embedding an SQL Database with Sqlite. Linux Journal,2003 06 01
4、薛启康.Linux环境下的数据库.中国计算机报,2001总期号:1009
5、张孝.嵌入式移动数据库的现状及发展[J/OL].