开始使用 Windows CE ,最近学习了一下其自带的属性数据库,天天翻 MSDN 太麻烦了,整理总结一下,以备以后使用时方便查询。
Windows CE 属性数据库有 CEDB 和 EDB 两种,其中前者是早期的版本,后者随 WINCE 5.0 发布。 EDB 与 CEDB 相比具备事务的功能,同时支持更多的更全的索引,支持更多的属性数量和更好的性能,特别是存储较大数据时。
虽然 WINCE 5.0 支持 EDB ,但是发布的 Windows CE Standard SDK 5.0 中却不含有 EDB 的 API , Windows mobile 的对应版本中则含有。在 WINCE 5.0 中使用 EDB 需要自己编译 SDK 来实现。
下面讨论一下 CEDB API 的使用。
根据 MSDN 的说明, CEDB 的 API 有些已经废弃,主要整理一下我已经学习使用的几个 API 的使用方法。
首先明确几个基本的概念:
数据库卷 (Database Volume) :一个文件,数据库中的所有数据存放的地方,可以含有多个数据库,每个数据库卷需要挂载才能使用(系统的对象存储器不在本文讨论之列),使用系统唯一的 GUID(Global Unique ID entifier ) 标示;
数据库 (DataBase) :数据库,数据的最高逻辑组织单元,多个数据库可以存放在同一个数据库卷中,彼此之间使用对象标示符 (OID : Object ID) 标示;
属性 (Property) :存储数据的逻辑性质 ( 结构化数据中的一项 ) ;
属性 ID :属性 ID 有两个功能,确定数据的类型和同类型的数据区分,关于属性 ID 需要说明的是 CEDB 支持 9 中类型的数据,包括二进制大对象( BLOB )、布尔型、 FILETIME 型、 2 字节 4 字节的有符号和无符号整数, 8 字节整数和 Unicode 字符串类型,属性 ID 用一个 4 字节的整数 ( 内存块 ) 表示,其中低字存放属性数据类型,有系统预定义了,高字存放应用程序自定义的属性标示符,用以区分同类型的属性,这样就使用属性 ID 完成了定义数据类型和属性性质的功能 ;
CEDB 的这些概念与关系型数据库对比就是:数据库卷相当于关系型数据库中的数据库, CEDB 的数据库相当于关系型数据库中的表,而 CEDB 中的属性则相当于关系型数据库中的字段。
1、 挂载数据库卷
数据库卷是 CEDB 存储数据的物理所在,是一个普通的文件,如果没有特别的属性标注,可能会被随意删除。同使用文件一样,在使用前需要先打开文件,这里称为数据库卷的挂载。
BOOL CeMountDBVol( PCEGUID pceguid, LPWSTR lpszDBVol,
DWORD dwFlags);
pceguid : CEGUID 类型指针,传入 CEGUID 变量,成功返回系统内唯一标示本数据库卷的 CEGUID ;
lpszDBVol : Unicode 字符串,传入数据库卷文件的路径;
dwFlags : DWORD 型数据,标示数据库卷的挂在类型,一般使用 OPEN_ALWAYS 即可;
函数成功返回 true ,失败返回 false ,可用 GetLastError 函数查看错误码。
2、 卸载数据库卷
关闭数据库卷文件。
BOOL CeUnmountDBVol( PCEGUID pceguid);
函数参数即待卸载的数据库卷 GUID 地址,成功执行返回 true ,失败返回 false 。
3、 创建数据库
数据库卷挂载成功之后,在存储数据之前,其中必须有数据库用于组织数据,数据库的创建使用函数:
CEOID CeCreateDatabaseEx2( PCEGUID pguid, CEDBASEINFOEX* pInfo);
pguid :所在数据库卷的 GUID 地址;
pInfo :数据库基本信息,主要包括属性和索引信息;
CEDBASEINFOEX 结构含有 9 个字段:
wVersion :版本信息, CEDB 只能使用 1 ;
dwFlags :标志信息,由于 CEDBASEINFOEX 结构可能用于不同的函数之中,数据库的创建、获取或设置数据库的信息等,用这一标志用于表示传入函数的 CEDBASEINFOEX 结构中那些字段是有效字段。创建函数基本上使用 CEDB_VALIDNAME| CEDB_VALIDTYPE |CEDB_VALIDSORTSPEC 组合就足够了,标示后的字段必须赋值,以免操作失败;
szDbaseName :数据库名, Unicode 字符串,由于 WINCE 中全部使用宽字符,此后的字符串若非特别说明全部都是宽字符型的,需要用 CEDB_VALIDNAME 标志标示;
dwDbaseType :数据库的类型标示符,随机的一个整数就行了,暂时没有搞清楚用途,一般填 1985 ,需要用 CEDB_VALIDTYPE 标志标示;
dwNumRecords :数据库中记录的个数;
wNumSortOrder :数据库中索引的个数;
dwSize :数据库的大小,使用 byte 衡量;
ftLastModified :数据库最近一次的修改时间, EDB 已经废弃这一字段,不用为上;
rgSortSpecs :数据库的索引信息,使用 CEDB_VALIDSORTSPEC 标志标示,本字段是一个容量为 CEDB_MAXSORTORDER 的 SORTORDERSPECEX 类型数组,其中只有前 wNumSortOrder 个有效。
至于 SORTORDERSPECEX 数据类型,是一个记录索引信息的结构体,含有 5 个字段:
wVersion :版本信息, CEDB 只能填 1 ;
wNumProps :本索引中属性的数量;
wKeyFlags :标示索引的属性,是否要求唯一性;
rgPropID :索引含有的属性信息,容量为 CEDB_MAXSORTPROP 的 CEPROPID 数组,同样,其中有效的是前 wNumProps 个,索引中属性的重要性,即后续排序所依据的属性,根据属性在本数组中的位置决定,排在前面的属性优先排序;
rgdwFlags :索引排序的方式,是与 rePropID 对应的数组,对应的位置决定对应的属性的排序方式,如升序或降序等,使用默认值就行。需要注意的是当索引是由多个属性键组合而成的时候,必须明确指定每个属性键的排序方式,否则会出现参数不合法的错误(87),从而导致函数调用失败。