无法读取kABPersonPhoneProperty

问题描述:

我正面临一个(奇怪的)问题:我想检索一个联系人的电话号码的数量,但由于某种原因,我无法。无法读取kABPersonPhoneProperty

我用

ABAddressBookRef addressBook = ABAddressBookCreate(); 
NSArray *contacts = (NSArray*) ABAddressBookCopyArrayOfAllPeople(addressBook); 
CFRelease(addressBook); 

把所有的触点阵列。然后我想用

ABMultiValueRef ref = ABRecordCopyValue([contacts objectAtIndex:i], kABPersonPhoneProperty); 

NSLog(@"%d",ref==NULL); 

ABRecordCopyValue总是返回nil ...
注意到,我能够检索其它信息有关的接触:例如,提取名称中使用

CFStringRef name = ABRecordCopyCompositeName([contacts objectAtIndex:i]); 
工作正常


有人可以解释我我做错了什么吗?我使用的是雪豹和Xcode 4.2和我正在开发适用于iOS 4.0 ...

编辑:我发现了一个解决方案:而不是使用

ABRecordCopyValue([contacts objectAtIndex:i], kABPersonPhoneProperty); 

我用

ABRecordID idRec = ABRecordGetRecordID([contacts objectAtIndex:i]); 
ABMultiValueRef ref = ABRecordCopyValue(ABAddressBookGetPersonWithRecordID(addressBook, idRec), kABPersonPhoneProperty); 

不过,我必须保持对addressBook的引用(不要释放它),因此EricS建议的解决方案似乎更好。

+0

它应该工作。尝试使用不同的多值,例如'kABPersonEmailProperty'。难道你所测试的每个人都没有电话号码?此外,没有什么,我会建议写'NULL == ref';反过来,不小心留下一个等号不会产生错误,并且会产生令人误解的结果。 :) – matt 2011-12-25 18:04:30

+0

没有改变。在我的通讯簿中,只有两个测试联系人:第一个有两个号码和一个电子邮件,而第二个有一个电话号码,没有电子邮件。在这两种情况下,它返回零... – Saphrosit 2011-12-25 18:16:18

+0

你解决了吗? – matt 2011-12-26 17:36:35

这只是一个猜测,但我会尝试保持地址簿打开,直到您完成读取。也就是说,在阅读完所有电话号码之后,请勿拨打CFRelease(addressBook);

地址簿更像是一个数据库而不是平面文件,并且在联系人记录中读取会为您提供对其他字段的引用,而不是所有实际字段内容。

+0

我发现了另一种解决方案,但在概念上与您的相同,但您更容易(请检查我的问题中的编辑)。 :)但是,我不明白为什么我原来的方法不应该工作...文件似乎有点肤浅... – Saphrosit 2011-12-27 14:55:30

+0

谢谢。它解决了我的问题。 – 2012-02-12 12:11:10

+0

这也解决了我的问题,谢谢 – Tys 2013-11-30 15:36:54