質問: アドレス帳のSQLデータベースの破損を引き起こすiPhoneのアドレス帳の繰り返し 私のアプリには、iphoneアドレス帳を開き、ユーザーの連絡先をループし、名前と電話番号をCore DataエンティティにコピーするNSOperationがあります。ほとんどの場合、これは問題なく動作しますが、まれにアドレス帳が破損し、すべての連絡先が失われているようです。私はアドレス帳に書いているわけではないので、これがどのように起こるかはわかりません。スタックトレースを投げたり、アプリをクラッシュさせたりすることはありません。私は再び私のアプリを実行した後に気づくだけです。ログで次のように表示されます... CPSqliteStatementSendResults:ファイルが暗号化されているか、データベースではありません。 checkResultWithStatement:ファイルが暗号化されているか、またはSELECT UID、識別子、(SELECT値FROM ABMultiValueLabel WHERE ROWID =ラベル)、ABMultiValue WHERE record_id WHERE値のデータベースではありません。 ANDプロパティ+ 0 =? ...そしてアドレス帳は空です。 アドレス帳を読み込んだり、正しく閉じたりしないで、アドレス帳をゴミ箱に入れることは可能ですか?
回答: この正確なことは私に以前起こった。 2つの異なるスレッドから同じABインスタンスにアクセスしており、アドレス帳はスレッドセーフではありません。 ABAddressBookCreate()を使用して、個々のスレッドごとに使用するインスタンスを取得することにしました。 From the documentation: `Important: Instances of ABAddressBookRef cannot be used by multiple threads. Each thread must make its own instance.` あなたはそれについてもっと読むことができます[ここ](https://developer.apple.com/library/ios/#documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/Chapters/BasicObjects.html#//apple_ref/doc/uid/TP40007744- CH3-SW1 )。 私はあなたが複数のスレッドから読むと、データベースが破損し、ユーザーがすべての連絡先を失うことを確認しました。