基於Symbian OS的通訊錄操作總結

用於記錄通訊信息的數據庫,存在於“/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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章