アドレス帳のSQLデータベースの破損を引き起こすiPhoneのアドレス帳の繰り返し

私のアプリには、iphoneアドレス帳を開き、ユーザーの連絡先をループし、名前と電話番号をCore DataエンティティにコピーするNSOperationがあります。ほとんどの場合、これは問題なく動作しますが、まれにアドレス帳が破損し、すべての連絡先が失われているようです。私はアドレス帳に書いているわけではないので、これがどのように起こるかはわかりません。スタックトレースを投げたり、アプリをクラッシュさせたりすることはありません。私は再び私のアプリを実行した後に気づくだけです。ログで次のように表示されます...

CPSqliteStatementSendResults:ファイルが暗号化されているか、データベースではありません。 checkResultWithStatement:ファイルが暗号化されているか、またはSELECT UID、識別子、(SELECT値FROM ABMultiValueLabel WHERE ROWID =ラベル)、ABMultiValue WHERE record_id WHERE値のデータベースではありません。 ANDプロパティ+ 0 =?

...そしてアドレス帳は空です。

アドレス帳を読み込んだり、正しく閉じたりしないで、アドレス帳をゴミ箱に入れることは可能ですか?

4
それはシミュレータとデバイスの両方で発生しましたか?
追加された 著者 shannoga,
アドレス帳が連絡先アプリでも機能しなくなっていますか、またはこの問題はあなたのアプリにのみ関連していますか?
追加された 著者 tidwall,
独自の NSOperationQueue を作成しているか、 [NSOperationQueue mainQueue] を使用していますか?
追加された 著者 tidwall,
この後、連絡先アプリでアドレス帳が空になります。連絡先アプリはうまく動作し、エントリがゼロになります。私はコード内のどこにでもアドレスブックを編集しているわけではありません。
追加された 著者 Kirby Todd,
それをデバイスでのみ見ました。これまでのところ、Xcodeを使用したデバッグモードのシミュレータやデバイスでは使用できません。それはクラッシュしないため、キャッチするのは難しいですし、アドレス帳が閉じられたときに次のアプリケーションが実行されるまでは起こっていないことはわかりません。
追加された 著者 Kirby Todd,
私たちは独自のNSOperationQueueを使用しています。
追加された 著者 Kirby Todd,

1 答え

この正確なことは私に以前起こった。

2つの異なるスレッドから同じABインスタンスにアクセスしており、アドレス帳はスレッドセーフではありません。

ABAddressBookCreate()を使用して、個々のスレッドごとに使用するインスタンスを取得することにしました。

From the documentation: Important: Instances of ABAddressBookRef cannot be used by multiple threads. Each thread must make its own instance.

あなたはそれについてもっと読むことができますここ

私はあなたが複数のスレッドから読むと、データベースが破損し、ユーザーがすべての連絡先を失うことを確認しました。

3
追加された
私たちはErica SadunのABContactsHelperラッパークラスを使用して、すべてのContactフェッチを処理しています。アドレス帳にアクセスするすべての関数に対してABAddressBookCreate()を分離するようです。私はアプリにいくつかのデバッグを追加して、どこのスレッドでも同じアドレス帳インスタンスを使用している場所を検出できるかどうかを確認します。
追加された 著者 Kirby Todd,