EDB是从Windows Mobile 5.0后出现的,提供了比CEDB更好的性能。
要使用EDB,首先就是mount
BOOL CeMountDBVol(
PCEGUID pceguid,
LPWSTR lpszDBVol,
DWORD dwFlags
);
它的第一个参数是一个CEGUID类型的指针,也是一种唯一标识符,一般在开始使用前先用CREATE_SYSTEMGUID来将其清0。第二个参数就是数据库卷的卷名,第三个参数就标志,这个标志位的意义与CreateFile的非常类似,其实EDB也是一种特殊的文件。也可以用CeMountDBVolEx函数来挂载卷。
将卷挂上之后,就可以使用CeCreateDatabaseWithProps函数来创建数据库。它的声明如下:
CEOID CeCreateDatabaseWithProps(
PCEGUID pGuid,
CEDBASEINFOEX* pInfo,
DWORD cProps,
CEPROPSPEC* prgProps
);
第一个参数就是CeMountDBVol的第一个参数传回的CEGUID,第二个参数是重点,里面包含了要创建的数据库的结构,即每个属性列的类型等。第三个参数指示了第四个参数的个数。第四个参数是好像是指定属性列的一些其它信息用的(这个也不清楚)。
CEDBASEINFOEX的定义如下:
typedef struct CEDBASEINFOEX {
WORD wVersion;
WORD wNumSortOrder;
DWORD dwFlags;
WCHAR szDbaseName[CEDB_MAXDBASENAMELEN];
DWORD dwDbaseType;
DWORD dwNumRecords;
DWORD dwSize;
FILETIME ftLastModified;
SORTORDERSPECEX rgSortSpecs[CEDB_MAXSORTORDER];
} CEDBASEINFOEX;
例如这段代码就创建了一个有两个属性列的数据库,第一个属性是名字,第二个属性是年龄。
CEDBASEINFOEX dbInfo = {0};
dbInfo.wVersion = CEDBASEINFOEX_VERSION;
dbInfo.dwFlags = CEDB_VALIDDBFLAGS | CEDB_VALIDNAME | CEDB_VALIDSORTSPEC;
dbInfo.wNumSortOrder = 1;
_tcscpy(dbInfo.szDbaseName, szDbname);
dbInfo.rgSortSpecs[0].wVersion = SORTORDERSPECEX_VERSION;
dbInfo.rgSortSpecs[0].wNumProps = 1;
dbInfo.rgSortSpecs[0].wKeyFlags = 0;
dbInfo.rgSortSpecs[0].rgPropID[0] = PROP_NAME;
dbInfo.rgSortSpecs[0].rgdwFlags[0] = CEDB_SORT_UNKNOWNFIRST;
dbInfo.rgSortSpecs[1].wVersion = SORTORDERSPECEX_VERSION;
dbInfo.rgSortSpecs[1].wNumProps = 1;
dbInfo.rgSortSpecs[1].wKeyFlags = 0;
dbInfo.rgSortSpecs[1].rgPropID[0] = PROP_AGE;
dbInfo.rgSortSpecs[1].rgdwFlags[0] = CEDB_SORT_UNKNOWNFIRST;
CeCreateDatabaseWithProps(&g_VolGuid, &dbInfo, 0, NULL);
因为rgSortSpecs数组被定义为16,所以EDB的属性列最多也就是16。
当创建好数据库之后,就可以打开数据库了,然后才能进行读写数据库。
要打开数据库,先用CeCreateSession创建一个会话,然后用CeOpenDatabaseInSession来得到一个数据库句柄。
写数据库是通过CeWriteRecordProps函数来实现的。
CeWriteRecordProps的定义如下:
CEOID CeWriteRecordProps(
HANDLE hDatabase,
CEOID oidRecord,
WORD cPropID,
CEPROPVAL* prgPropVal
);
若oidRecord为0,则新添加的记录直接追加到最后。最后一个参数是用来填充属性的数据。
要写数据库,示例代码如下:
prop[0].propid = PROP_NAME;
prop[0].val.lpwstr = _T("某某");
prop[0].wFlags = 0;
prop[1].propid = PROP_AGE;
prop[1].val.uiVal = 25;
prop[1].wFlags = 0;
CeWriteRecordProps(hdb, 0, 2, prop);
要想读数据库,只要用CeReadRecordPropsEx函数即可。
它的定义如下:
CEOID CeReadRecordPropsEx(
HANDLE hDatabase,
DWORD dwFlags,
LPWORD lpcPropID,
CEPROPID* prgPropID,
LPBYTE lplpBuffer,
LPDWORD lpcbBuffer,
HANDLE hHeap
);
第三个参数是返回属性列的个数,第四个参数即是用来指定要接收哪些属性列的数据,如果为NULL,则接收所有。第五个参数即是返回的数据。如果第二个参数指定为:CEDB_ALLOWREALLOC的话,则在不必要使用lplpBuffer之前申请空间。最后一个参数就是要使用的堆的句柄。
再操作完之后,要使用CloseHandle关闭数据库的句柄,并且再最后CeUnmountDBVol卸载数据库。