无法读取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建议的解决方案似乎更好。
答
这只是一个猜测,但我会尝试保持地址簿打开,直到您完成读取。也就是说,在阅读完所有电话号码之后,请勿拨打CFRelease(addressBook);
。
地址簿更像是一个数据库而不是平面文件,并且在联系人记录中读取会为您提供对其他字段的引用,而不是所有实际字段内容。
它应该工作。尝试使用不同的多值,例如'kABPersonEmailProperty'。难道你所测试的每个人都没有电话号码?此外,没有什么,我会建议写'NULL == ref';反过来,不小心留下一个等号不会产生错误,并且会产生令人误解的结果。 :) – matt 2011-12-25 18:04:30
没有改变。在我的通讯簿中,只有两个测试联系人:第一个有两个号码和一个电子邮件,而第二个有一个电话号码,没有电子邮件。在这两种情况下,它返回零... – Saphrosit 2011-12-25 18:16:18
你解决了吗? – matt 2011-12-26 17:36:35