在我的应用程序中,我有两个视图,主视图和联系人视图,我有一个已保存的联系人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);
答案 0 :(得分:0)
感谢Abhijith的帮助,我想出了这个问题背后的原因,我不应该打电话
在 For loop 下的 TRAPD 下直接ReadContactL ,所以我创建了一个检查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);
}