16

ABRecordID がクラウド同期間で変化する可能性がある場合、および他の状況下で制御できない場合、IOS アドレス帳レコードへの長期的な参照を維持するにはどうすればよいですか?

Apple は次のガイダンスを提供します。

「特定のレコードへの長期的な参照を保持するための推奨される方法は、識別子に加えて、姓と名、または姓と名のハッシュを保存することです。ID でレコードを検索するときは、比較します。レコードの名前を保存された名前に変換します。一致しない場合は、保存された名前を使用してレコードを検索し、レコードの新しい ID を保存してください。」

しかし、私はこのガイダンスを理解していません。アドレス帳に重複した名前を含めることができ、ユーザーがレコード内の名前を変更できる場合、このアドバイスはどのように機能しますか?

たとえば、ユーザーがアドレス帳レコードの名前を変更すると、私のルーチンは ABRecordID による検索に失敗するため、保存した名前ハッシュによる検索では、その特定の新しい ABRecordID の代わりに重複した名前を見つけることができなかったと思います。以前に参照したレコード?

最後に、IOS AddressBook レコードへの長期参照を取得する最良の方法は何ですか? そして、上記のアドバイスが本当に機能する場合、何が欠けていますか?

4

4 に答える 4

3

RecordID は、削除またはリセット時にのみ変更されます。これが行われると、すべての新しいレコードに新しい createdProperty および modifiedProperty も含まれます。

  1. 初めてアドレス帳を読んでいるときに、レコードのすべてのエントリを RecordID と共にデータベースに保存します。

  2. 連絡先が連絡先からデータベースに最後に同期された時間を保存し (何か名前を付けます: lastSyncedTime)、どこかに保存します。

初めての連絡先の同期が完了しました。今後いつでも同期できるように、次の手順を実行します。

すべてのレコードを繰り返しながら、

  1. createdTime(kABPersonCreationDateProperty) と lastSyncedTime を確認してください。createdTime > lastSyncedTime の場合、recordID を「newRecords」NSArray に保存します。

  2. !(ステップ 1) の場合、modifiedDate(kABPersonModificationDateProperty) と lastSyncedTime を確認します。modifiedDate > lastSyncedTime の場合、recordID を「modifiedRecords」NSArray に格納します。

  3. if !(1) && !(2) すべてのレコード ID を「unModifiedRecords」に格納します。

次に、ローカル データベースからすべての連絡先を読み取ります。

  1. 「modifiedRecords」にも「unModifiedRecords」にも見つからないすべてのローカル データベース レコードを削除します。

  2. ローカル データベース内のすべての「modifiedRecords」を更新します。

  3. 「newRecords」のすべてのレコードに対して新しいレコードを作成します。

  4. それに応じて lastSyncedTime を更新します。

于 2013-08-29T10:41:56.247 に答える
0

ドキュメントは、ABRecordID を永続的な識別子として当てにできないことを伝えています。

次のシナリオを考えてみましょう: ユーザーは "Bob Smith" のレコードを持っています。次に、ユーザーは自分の "Bob Smith" レコードを削除し、iTunes 同期を介して自分のコンピューターから連絡先をインポートします (新しい ID を作成します)。

したがって、既存の連絡先への永続的な参照を保持したい場合は、以前に使用したのと同じレコードであるというヒントとして名前と ID への参照を保持できますが、実際の永続的な参照はありません

アドレス帳の連絡先を永続的に参照している場合は、以前に使用した連絡先とは異なる可能性があるという事実に常に対処する準備ができている必要があります。

于 2013-02-08T06:11:48.450 に答える