2011-12-25 64 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]); 
工作正常


有人可以解釋我我做錯了什麼嗎?我使用的是雪豹和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

回答

17

這只是一個猜測,但我會嘗試保持地址簿打開,直到您完成讀取。也就是說,在閱讀完所有電話號碼之後,請勿撥打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