In my application I have two views, Main View and Contacts view, and I have a saved Contacts ID.
When I load my second view, that should access default Contacts Database using my saved ID list and get these contacts information Title, etc. It leaves because the contact has been deleted.
So, How can I check if the contact that I has its ID is exists before I try to access its fields and cause a leave ?
CContactDatabase* contactsDb = CContactDatabase::OpenL();
CleanupStack::PushL(contactsDb);
for (TInt i = 0; i < CsIDs.Count(); i++)// looping through contacts.
{
TRAPD(err, contactsDb->ReadContactL(CsIDs[i])) //---->CsIDs is an array that holds IDs
if(KErrNotFound == err)
{
CsIDs.Remove(i);
}
}
CleanupStack::PopAndDestroy(1,contactsDb);
Thanks Abhijith for your help, and I figured out the reason behind this issue, I shouldn't call
ReadContactL directly under TRAPD under For loop, So I created a function that checks the ID validity
and I called it under TRAPD, and now my Contacts List View loads well, and invalid IDs removed from
My saved IDs list.
Solution is to follow Symbian C++ rules when dealing with "Leave":
void LoadContactsL()
{
CContactDatabase* contactsDb = CContactDatabase::OpenL();
CleanupStack::PushL(contactsDb);
for (TInt i = 0; i < CsIDs.Count(); i++)// looping through contacts.
{
TRAPD(err, ChickValidContactsIDL(i)) //-->Calling IDs checking function under TRAPD
if(KErrNotFound == err)
{
CsIDs.Remove(i);
}
}
CleanupStack::PopAndDestroy(1,contactsDb);
}
// A function that checks invalid IDs.
//Important Symbian rule: Return "void" for functions that "Leave" under TRAP harness.
void ChickValidContactsIDL(TInt index)
{
CPbkContactEngine* iPbkEngine = CPbkContactEngine::NewL(&iEikonEnv->FsSession());
CleanupStack::PushL(iPbkEngine);
iPbkEngine->OpenContactL(CsIDs[index]);
CleanupStack::PopAndDestroy(1,iPbkEngine);
}