如何在Symbian应用程序中检查有效的联系人ID



在我的应用程序中,我有两个视图,主视图和联系人视图,并且我有一个保存的联系人ID。

当我加载第二个视图时,它应该使用我保存的ID列表访问默认的联系人数据库,并获取这些联系人信息标题等。它会离开,因为联系人已被删除。

那么,在我尝试访问其字段并导致休假之前,我如何检查我拥有其ID的联系人是否存在?

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);

感谢Abhijith的帮助,我找到了这个问题背后的原因,我不应该打电话给

ReadContactL直接在TRAPD下对于循环,所以我创建了一个检查ID有效性的函数

我在TRAPD下调用了它,现在我的联系人列表视图加载良好,并且从中删除了无效ID

我保存的ID列表。

解决方案是在处理"离开"时遵循Symbian C++规则:

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);
  }

//一种检查无效ID的函数。

//重要的Symbian规则:对于TRAP线束下"离开"的函数,返回"void

void ChickValidContactsIDL(TInt index)
{
   CPbkContactEngine* iPbkEngine = CPbkContactEngine::NewL(&iEikonEnv->FsSession());
       CleanupStack::PushL(iPbkEngine);
       iPbkEngine->OpenContactL(CsIDs[index]);
   CleanupStack::PopAndDestroy(1,iPbkEngine);           
} 

相关内容

最新更新