用於記錄通訊信息的數據庫,存在於“/system/data/”目錄下,文件名爲“contacts.cdb”。主要操作有:
1、打開數據庫:
CContactDatabase* database=CContactDatabase::OpenL( );
CleanupStack::PushL(database);……..CleanupStack::PopAndDestroy(database);
2、添加新記錄
例1、建立一個新記錄:
CContactItem* sys_template=
database->CreateContactCardTemplateL(_L(“Contacts”),EFalse);
CContactCard* newCard=CContactCard::NewL(sys_template);
//從database中複製一個模板到新記錄中
設置字段組引用變量:
CContactItemFieldSet& currentFieldSet=newCard->CardFields( );
求得字段數:
const Tuint fieldCount=currentFieldSet.Count( );
設置字段引用變量:
CContactItemField& field=currentFieldSet[n];
設置字段類型:
const CContentType& type=field.ContentType( );
type.ContentsFieldType(KUidContactFieldGivenName)
向字段存入數據:
CContactTextField* textStorage=field.TextStorage( );
textStorage->SetTextL(buf);
向數據庫中插入新記錄:
cardId=database->AddNewContactL(*newCard);
例2、// 字符串聲明
_LIT(KForenameLabel,"Forename");
_LIT(KSurnameLabel,"Surname");
_LIT(KWorkPhoneLabel,"Work Phone");
_LIT(KForename,"Steve");
_LIT(KOtherForename,"Bob");
_LIT(KSurname,"Wilkinson");
_LIT(KWorkPhone,"+441617779700");
//打開默認數據庫
CContactDatabase* contactsDb = CContactDatabase::OpenL();
CleanupStack::PushL(contactsDb);
// 建立一個新記錄,併爲該記錄添加字段:
CContactItem* contact = CContactCard::NewLC();
CContactItemField* field =
CContactItemField::NewLC(KStorageTypeText, KUidContactFieldFamilyName);
field->SetMapping(KUidContactFieldVCardMapUnusedN);
//建立與vCard的映射
field->SetLabelL(KSurnameLabel);//設置字段標籤
field->TextStorage()->SetTextL(KSurname);//設置字段值
contact->AddFieldL(*field);//把該字段加入到記錄中
CleanupStack::Pop();
//添加givenname字段
field=CContactItemField::NewLC(KStorageTypeText, KUidContactFieldGivenName);
field->SetMapping(KUidContactFieldVCardMapUnusedN);
field->SetLabelL(KForenameLabel);
field->TextStorage()->SetTextL(KForename);
contact->AddFieldL(*field);
CleanupStack::Pop();
//添加phonenumber字段
field=CContactItemField::NewLC(KStorageTypeText, KUidContactFieldPhoneNumber);
field->SetMapping(KUidContactFieldVCardMapTEL);
field->SetLabelL(KWorkPhoneLabel);
field->TextStorage()->SetTextL(KWorkPhone);
contact->AddFieldL(*field);
CleanupStack::Pop();
//把建立的新記錄添加到數據庫中
contactsDb->AddNewContactL(*contact);
contactsDb->SetOwnCardL(*contact);
CleanupStack::PopAndDestroy(2); // contact contactsDb
3、從數據庫中讀出數據
CContactDatabase* contactsDb = CContactDatabase::OpenL();
CleanupStack::PushL(contactsDb);
// Get the ID of the own card and open the contact:
TContactItemId ownCardId = contactsDb->OwnCardId();
CContactItem* ownCard = contactsDb->ReadContactL(ownCardId);
CleanupStack::PushL(ownCard);
TInt count = ownCard->CardFields().Count();
contactsDb->CloseContactL(ownCard->Id());
CleanupStack::PopAndDestroy(); // ownCard
3、編輯數據庫中的記錄
ownCard = contactsDb->OpenContactL(ownCardId);
CleanupStack::PushL(ownCard);
TInt index =
ownCard->CardFields().Find(KUidContactFieldGivenName);
ownCard->CardFields()[index].TextStorage()
->SetTextL(KOtherForename);
contactsDb->CommitContactL(*ownCard);//提交所做的修改
CleanupStack::PopAndDestroy(2);
4、遍歷數據庫中的所有記錄
CContactDatabase* contactsDb = CContactDatabase::OpenL();
CleanupStack::PushL(contactsDb);
TContactIter iter(*contactsDb);//建立遍歷對象
TContactItemId cardId;
while( ( cardId = iter.NextL() ) != KNullContactId )
{
CContactItem* card = contactsDb->ReadContactL(cardId);
CleanupStack::PushL(card);
TInt nField =
card->CardFields().Find(KUidContactFieldGivenName);
TInt fField =
card->CardFields().Find(KUidContactFieldFamilyName);
if( nField!=KErrNotFound && fField!=KErrNotFound )
{ //讀出數據
TPtrC name =
card->CardFields()[nField].TextStorage()->Text();
TPtrC fName =
card->CardFields()[fField].TextStorage()->Text();
iEikonEnv->InfoWinL(name, fName);
}
contactsDb->CloseContactL(card->Id());
CleanupStack::PopAndDestroy(); // card
}
CleanupStack::PopAndDestroy(); // contactsDb
5、過濾數據庫中的記錄
CContactDatabase* contactsDb = CContactDatabase::OpenL();
CleanupStack::PushL(contactsDb);
CCntFilter *filter = CCntFilter::NewLC();//建立過濾對象
filter->SetContactFilterTypeALL(EFalse);
filter->SetContactFilterTypeCard(ETrue);
_LIT(KFilterDate,"20040101:");
filter->SetFilterDateTime( TTime(KFilterDate) );
filter->SetIncludeModifiedContacts(ETrue);
contactsDb->FilterDatabaseL(*filter);
TInt count = filter->iIds->Count();
CleanupStack::PopAndDestroy(2); // filter contactsDb
注:在某些symbian手機中,若沒有設定DateTime可能會出現錯誤。
6、數據庫查詢
所用的函數有:
CContactDatabase::FindLC() ;
CContactDatabase::FindInTextDefLC();.
FindInTextDefLC() ;
FindInTextDefAsyncL();
例1、 FindInTextDefAsyncL()的應用:
iContactsDb = CContactDatabase::OpenL();
iFieldDef = new (ELeave)CContactItemFieldDef();
iFieldDef->AppendL(KUidContactFieldGivenName);
iFieldDef->AppendL(KUidContactFieldFamilyName);
_LIT(KFindToken, "Bond");
iFinder =
iContactsDb->FindAsyncL( KFindToken, iFieldDef, this);
if(iFinder->IsComplete())
{
if(iFinder->Error() == KErrNone)
{
CContactIdArray* result = iFinder->TakeContactIds();
for(TInt i=0; i<result->Count(); i++)
{
TInt cardId = (*result)[i];
// do something with the card
}
delete result;
}
delete iFinder;
delete iFieldDef;
delete iContactsDb;
}