通过读数据库来获取手机联系人

要获取手机中的联系人,微软提供了Icontact接口,可以实现,获取Sim卡联系人,可以通过SimReadPhonebookEntry函数来实现,在SDk中均提供了例子。不过还可以通过读数据库的方法来读取联系人

记得以前在网上看到过有人测试过用Icontact接口来读联系人和用读数据库的方法来获取联系人的效率,好像读数据库可以快很多。

手机联系人存储在pim.vol卷上,数据库名为:Contacts Database,不知道从什么时候开时,Sim卡联系人也存储在了这个数据库里面,所以要获取所有联系人的话,只读这一个数据库就可以了,而且可以提高一下读取时的速度,好像尤其读Sim卡的时候是比较慢的。

打开数据库后,先获取里面联系人的条数,然后申请空间,再一条一条的往外读。

 

下面是代码:

  1. int GetContactByEDB()
  2. {
  3.     CEGUID  guid = {0};
  4.     CREATE_INVALIDGUID(&guid); 
  5.     if (!CeMountDBVolEx(&guid, _T("pim.vol"), NULL, OPEN_EXISTING | EDB_MOUNT_FLAG))
  6.     {
  7.         return  -1;
  8.     }
  9.     CEOID   oid = 0;
  10.     HANDLE hDatabase = CeOpenDatabaseInSession(NULL, &guid, &oid, 
  11.         _T("Contacts Database"), NULL, 
  12.         CEDB_AUTOINCREMENT, NULL);
  13.     if (hDatabase == INVALID_HANDLE_VALUE)
  14.     {
  15.         CeUnmountDBVol(&guid);
  16.         return  -1;
  17.     }
  18.     //取得联系人的数目
  19.     BY_HANDLE_DB_INFORMATION    bhdi = {0}; 
  20.     bhdi.wVersion = 2; 
  21.     bhdi.guidVol = guid; 
  22.     bhdi.oidDbase = oid; 
  23.     if (!CeGetDBInformationByHandle(hDatabase, &bhdi)) 
  24.     { 
  25.         return    -1; 
  26.     }
  27.     DWORD   dwContactNumber = bhdi.infDatabase.dwNumRecords;
  28.     *ppuInfo = new PhoneUserInfo[dwContactNumber];
  29.     if (*ppuInfo == NULL)
  30.     {
  31.         return  -1;
  32.     }
  33.     //开始读取
  34.     WORD    wNumProps = 0; 
  35.     CEPROPVAL *pRecord = NULL; 
  36.     DWORD   dwBufSize = 0; 
  37.     CEOID   oidRecord = 0;
  38.     DWORD   dwPos = 0;
  39.     CeSeekDatabaseEx(hDatabase, CEDB_SEEK_BEGINNING, 0, 0, 0);
  40.     while (oidRecord = CeReadRecordPropsEx(hDatabase, CEDB_ALLOWREALLOC, &wNumProps, NULL, (LPBYTE *)&pRecord, &dwBufSize, NULL)) 
  41.     { 
  42.         for (int i = 0; i < wNumProps; i++)
  43.         { 
  44.             switch(pRecord[i].propid)  
  45.             { 
  46.             case    PIMPR_FIRST_NAME:           
  47.                 break;
  48.             case    PIMPR_LAST_NAME:            
  49.                 break;
  50.             case    PIMPR_MOBILE_TELEPHONE_NUMBER:      //移动电话(SIM卡读出来的字段也是这个)
  51.                 break;
  52.             } 
  53.         }
  54.         dwPos++;
  55.     }
  56.     CloseHandle(hDatabase);
  57.     CeUnmountDBVol(&guid);
  58.     return  dwPos;
  59. }

有人说用CeGetDBInformationByHandle获取数据库记录不成功,我测试的时候正常,能正确的获取记录条数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值