2011-12-25 6 views
3

Я столкнулся с (странной) проблемой: я хотел бы получить количество телефонных номеров контакта, но по какой-то причине я не могу.Не удается прочитать 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]); 


Может кто-нибудь объяснить мне, что я делаю неправильно? Я использую Snow Leopard с Xcode 4.2 и я разрабатываю для прошивки 4.0 ...

EDIT: Я нашел решение: вместо того, чтобы использовать

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

+0

Ничего не изменилось. В моей адресной книге есть только два тестовых контакта: у первого есть два номера и одно электронное письмо, а во втором - 1 номер телефона и нет электронной почты. В обоих случаях он возвращает nil ... – Saphrosit

+0

Вы разрешили это? – matt

ответ

17

Это всего лишь догадка, но я бы попытался открыть адресную книгу, пока вы не прочитаете ее. То есть, не звоните CFRelease(addressBook);, пока не прочитаете все номера телефонов.

Адресная книга больше похожа на базу данных, чем на плоский файл, и чтение в записи контакта дает вам ссылки на другие поля & данные, а не все фактическое содержимое поля.

+0

Я нашел другое решение, но концептуально это то же самое, что и у вас, но вам проще (отметьте редактирование в моем вопросе). :) Однако я не очень хорошо понимаю, почему мой оригинальный подход не должен работать ... документация кажется немного поверхностной о ... – Saphrosit

+0

Спасибо. Это решило мою проблему. –

+0

Это тоже решило мою проблему, спасибо – Tys

Смежные вопросы