2017-02-01 3 views
0

私はアンドロイドの連絡先アプリを作成していますので、私は定期的にユーザーの連絡先を読み、アプリに保存しています。これを行うために、私は私のアプリでは、私は私が更新するべき接触知っているので、IDのいくつかの種類に依存している(または追加/削除)する必要があるとContacts Providerは、それらのいくつか提供:Androidの連絡先を読むときにSOURCE_IDに依存する必要がありますか?

  • CONTACT_IDが集約接触IDです、
  • 各集計接触が持つそれぞれが、一つ以上の生のコンタクトから構成され、独自のRAW_CONTACT_ID
  • 、最も重要なのは、各生の連絡先は、この接触が持つIDすなわちサーバIDであると考えられるSOURCE_IDを、持っていますこのアカウントのサーバーで

SOURCE_IDに頼ることにしましたが、これは最も安定した音であると考えられています。例えば。ユーザーがデバイス内の同じアカウントを削除して再追加すると、このアカウントの連絡先が異なるIDを取得しないようにすることができます。これは、アプリで一致させることができないためです。

ですが、Gmailの同期アダプターでは、下記のような約束を守っているようです。 Exchange同期アダプタは残念ながらSOURCE_IDが変更されていません。サーバ番号は23:4のように小さいため、間違いなくサーバIDはありません。

質問:この問題を解決する方法はありますか?私は右のIDを使用していますか? Exchangeアダプターは他のフィールドに「永続サーバーID」を保管していますか?

ドキュメントSOURCE_IDmust be unique for each account type and should be stable across syncs

  • ユニーク:アカウントの各生の接触は、独自のソースIDを持っている必要があります。これを強制しないと、連絡先 アプリケーションで問題が発生します。同じアカウントタイプ の2つの未加工の連絡先が同じ発信元IDを持つ可能性があることに注意してください。たとえば、アカウント[email protected]の生の連絡先「Thomas Higginson」は、 アカウント[email protected]の生の連絡先「Thomas Higginson」と同じソースIDを持つことが許可されています( )。
  • 安定:ソースIDは、生の連絡先のオンラインサービスのデータの永続的な部分です。たとえば、ユーザーが連絡先ストレージ をApps設定から消去して再同期した場合、復元された生の連絡先には以前と同じソースIDが である必要があります。これを強制しないと、 ショートカットが機能しなくなります。

答えて

0

まず最初に、それはあなたのアプリケーションにIDを保存するためには良い考えではありませんし、Idは時間とともに変化し、一貫性がないことを願って。 「SOURCE_ID」の列は他の2つ(CONTACT_IDは最も脆弱ですが、「RAW_CONTACT_ID」はユーザーが少なくともログアウトして再度ログインするまで続きます)に比べて一貫性があります。

私たちは連絡先と同期可能なアカウントを持っており、raw_contactsテーブル(SYNC1 - SYNC10)の汎用列の1つにunique idを保存していました。だからGoogleでは、アカウントプロバイダが特定の方法でデータベースの列を使用することを提案していますが、それはプロバイダの責任です。

一般的なルールは、これらのIDを長期間の永続性に使用しないでください。また、連絡先アプリケーションを作成しているので、明らかに何らかの種類の参照キーが必要です。そのような場合は、すべてのアカウントプロバイダが同じ列にキーを置くという規則に従わないでください。それは脆いが、それはそうである。

編集 - ContactsColumns.LOOKUP_KEYを使用する必要があります(以前の回答も同じです)。

LOOKUP_KEY APIレベル5文字列LOOKUP_KEYで

追加その行IDは の結果として同期を変更した場合、または連絡先を検索する方法について のヒントが含まれている不透明な値 - のGoogleドキュメントあたりとして集約。

定数値: "検索"

https://developer.android.com/reference/android/provider/ContactsContract.ContactsColumns.html#LOOKUP_KEY

あなたが提供するAPIのを使用して連絡先IDを持っている場合は、検索キーを取得することができます。ここをクリックしてください - https://developer.android.com/reference/android/provider/ContactsContract.Contacts.html

+0

私が 'ID'に頼ると、時間の経過と共に変化すると思うはずです。それでは、これらのIDではない場合、どのようなリファレンスを使用すればより永続的になりますか? –

+0

あなたの質問は他の答えで答えられました。あなたが使用する必要があるキーは 'Contacts.LOOKUP_KEY'です。一般に、検索キーは多くのコンポーネントから生成される複合キーです。私はちょうど私の答えを編集しました – Dibzmania

1

LOOKUP_KEYはあなたが探しているものです。

LOOKUP_KEY

その行IDが同期または凝集の結果として変更された場合 コンタクトを検索する方法についてのヒントが含ま不透明値。

あなたは、連絡先を追跡するために<CONTACT_ID, LOOKUP_KEY>ペアを使用する必要があります。 通常の使用ではCONTACT_IDの値を使用しますが、コードにが変更されたというヒント(紛失または予期しない連絡先の名前)がある場合はを新しい連絡先IDと見なしてLOOKUP_KEYを見つけることができます。

Contacts.getLookupUri()を使用すると、CONTACT_IDまたはLOOKUP_KEYの実際の値が何であるかにかかわらず、いつでも連絡先をすばやく見つけることができるURIを取得できます。

+0

あなたの答えに感謝しますが、削除、アカウントを再追加のシナリオはどうですか?私は 'LOOKUP_KEY'が変わると思う? –

+0

LOOKUP_KEYは安定したIDではないので、変更されますが、**常にContacts.getLookupUri(id、key)を使用して、同じ連絡先を指すuriを取得できます(noその新しいIDが何であるかも重要です)。 lookup-keyにはシステムへのヒントが含まれています。その連絡先を見つける方法は – marmor

+0

ありがとうございます。それでは、試してみましょう。 –

関連する問題