Question

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);
Was it helpful?

Solution

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);           
} 
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top