Windows CE平臺上的數(shù)據(jù)庫編程
隨著掌上電腦的迅速崛起,微軟推出的運行在掌上電腦上的操作系統(tǒng)Windows CE越來越引人矚目。
Windows CE包括一個Win32 API子集,一個適宜于靜態(tài)、動態(tài)內(nèi)存存儲的文件系統(tǒng)等。根據(jù)需要,還增加了一些Windows所沒有的特性,增加了一些新的API(包括一些新的數(shù)據(jù)庫API)。其中數(shù)據(jù)庫被定位在對象存儲(Object Store)中。對象存儲是掌上電腦內(nèi)存的一部分,是操作系統(tǒng)分配來存儲永久文件、注冊表、Windows CE 數(shù)據(jù)庫的。掌上電腦剩余的內(nèi)存是應(yīng)用程序內(nèi)存,供應(yīng)用程序使用。
Windows CE中用來操作數(shù)據(jù)庫的函數(shù)有:打開數(shù)據(jù)庫CeOpenDatabase(); 關(guān)閉數(shù)據(jù)庫CloseHandle(); 刪除紀錄CeDeleteRecord等。
Windows CE上數(shù)據(jù)庫的一些附加特性也是很有意思的,如數(shù)據(jù)庫支持“time stamps”,這個特性讓開發(fā)者可以測試自上次讀數(shù)據(jù)后是否有別的程序修改了數(shù)據(jù)。
下面讓我們詳細介紹Windows CE上的數(shù)據(jù)庫編程(開發(fā)工具:VC 5.0,WindowsCE ToolKit for VC 5.0)。
基本數(shù)據(jù)庫操作
1.創(chuàng)建數(shù)據(jù)庫
void CMyDB::CreateDatabase() { CCeDBDatabase db; // 檢查數(shù)據(jù)庫是否存在 if(!CCeDBDatabase::Exists(_T("My Database"))) { file://如果數(shù)據(jù)庫不存在,就創(chuàng)建它 db.Create(_T("My Database")); } }
|
2.打開數(shù)據(jù)庫
CCeDBDatabase db; db.Open(_T(″My Database″));
|
3.刪除數(shù)據(jù)庫
CCeDBDatabase db; if (db.Open(_T(″My Database″))) db.Delete();
|
4.關(guān)閉數(shù)據(jù)庫
CCeDBDatabase db; db.Open(_T(″My Database″)); db.Close();
|
向數(shù)據(jù)庫中加入紀錄
這里我向大家介紹另兩個數(shù)據(jù)庫類:CCeDBRecord,CCeDBProp。
創(chuàng)建數(shù)據(jù)庫時,我們可以同時定義字段,然后設(shè)置紀錄變量的各字段值,最后將記錄加入到數(shù)據(jù)庫中。
// Create database const DWORD DB_IDENT_ID = 11111; const WORD PROP_NAME=101,PROP_AGE=102,PROP_GENDER=103; CCeDBDatabase db ; CEOID poid; CCeDBProp dbprops[3] = { CCeDBProp(CCeDBProp::Type_String,PROP_NAME,CCeDBProp::Sort_Ascending), CCeDBProp(CCeDBProp::Type_UShort,PROP_AGE,CCeDBProp::Sort_Descending), CCeDBProp(CCeDBProp::Type_UShort,PROP_GENDER,CCeDBProp::Sort_UnknownFirst) };
if(!(poid = db.Create((_T("My DB"),DB_IDENT_ID,3,dbprops))) return FALSE; if(!db.Open(poid)) return FALSE;
// Add records CCeDBRecord rec; CCeDBProp props[3]; props[0] = CCeDBProp(_T("LiMing"),PROP_NAME); props[1] = CCeDBProp((USHORT)20, PROP_AGE); props[2] = CCeDBProp((USHORT)'M',PROP_GENDER); rec.AddProps(props,3); if(!db.AddRecord(&rec)) return FALSE;
|
從數(shù)據(jù)庫中檢索紀錄
我們可以通過調(diào)用CCeDBDatabase::GetNumRecords()獲取紀錄數(shù)。通過CCeDBDatabase::GetCurrRecord()獲取每個紀錄的指針。
BOOL bPrev = pdb-〉m_bAutoSeekNext; pdb-〉m_bAutoSeekNext = TRUE; pdb-〉SeekFirst(); while(pdb-〉ReadCurrRecord(&rec)) MyPrintRecord(&rec);//處理數(shù)據(jù)(顯示記錄) pdb-〉m_bAutoSeekNext = bPrev;
通過調(diào)用CCeDBRecord::GetPropFromIdent()獲取每個字段值。
pPropName=prec-〉GetPropFromIdent(PROP_NAME); LPWSTR strName=pPropName-〉GetString(); 除了可以遍歷數(shù)據(jù)庫紀錄外,還可按條件查找紀錄,如:查找具有指定屬性的記錄。 CCeDBProp prop;
....//設(shè)置待查找紀錄的屬性 db.SeekFirstEqual(&prop); 從數(shù)據(jù)庫中刪除紀錄
file://先查找指定紀錄 db.DeleteCurrRecord();
修改數(shù)據(jù)庫中紀錄
CCeDBRecord rec; ....//查找待修改的記錄
....//修改記錄的屬性
|
|