2011-12-25 13 views
3

私は(奇妙な)問題に直面しています。連絡先の電話番号の番号を取得したいのですが、何らかの理由で私はできません。kABPersonPhonePropertyを読むことができません

私は、すべての連絡先の配列を取得するために

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

を使用。例えば、名前を抽出する

CFStringRef name = ABRecordCopyCompositeName([contacts objectAtIndex:i]); 
を使用して正常に動作します:そして、私はいつも私が連絡先に関するその他の情報を取得することができるよ nil ...
お知らせを返し

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

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

が、ABRecordCopyValueを使用したいです


私が間違っていることを誰かに説明してもらえますか?

... EDITを私はXcodeの4.2でのSnow Leopardを使用していると私は、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

+0

何も変更されていません。私のアドレス帳には2つのテスト連絡先しかありません。最初の電話番号は2つの電子メールと1つの電子メールですが、2番目の番号は1つの電話番号と電子メールはありません。どちらの場合も、それは何も返しません... – Saphrosit

+0

これを解決しましたか? – matt

答えて

17

これは単なる推測ですが、私はあなたが読むことが終わるまでアドレス帳を開いたままにしておきます。つまり、すべての電話番号を読み取るまでCFRelease(addressBook);に電話をかけないでください。

アドレス帳はフラットファイルよりもデータベースに似ていて、連絡先レコードを読むと、実際のフィールドの内容のすべてではなく、他のフィールド&のデータを参照できます。

+0

私は別の解決策を見つけましたが、概念的にあなたと同じですが、あなたの方が簡単です(私の質問で編集を確認してください)。 :)しかし私は私の元のアプローチがうまくいかない理由をよく理解していません...ドキュメンテーションは少し面白そうですね... – Saphrosit

+0

ありがとう。それは私の問題を解決しました。 –

+0

これも私の問題を解決しました。ありがとう – Tys

関連する問題