在我的应用程序中,我有两个视图,主视图和联系人视图,并且我有一个保存的联系人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);
}