Windows CE学习之属性数据库(一)

开始使用 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),从而导致函数调用失败。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值