2017-01-18 20 views
0

私はここ数週間の間に同期アダプタの概念全体を理解しようとしており、機能に関する質問はほとんどありません。私はAndroidの連絡先内のすべての変更にAndroid - Androidの連絡先を聞いてデルタを取得

アプローチ1聴きたい

を私はカスタムアカウントを作成しても、同期アダプタを作成しました。 ContactsContract.Contacts.CONTENT_URIと、 、public void onChange(boolean selfChange)ContentObserverクラスのブロードキャストリスナーを作成しました。連絡先データが変更されたときに、同期アダプタを起動するためのトリガーポイントとして機能しているContentResolver.requestSync(account,ContactsContract.AUTHORITY,bundle)を呼び出しています。

すべてはここまで正常に見えるが、SyncAdapterクラスで私はonPerofmSync

SyncResult変数に任意のデータが届かないので、どのように私は、連絡先からのデルタ変化を得ることができますか?

これが同期アダプタをトリガする方法でない場合は、私を修正してください。

アプローチ2:

私は変更を取得することができたが、私の質問は

である彼らは dirtyFlagが1 に設定されている連絡先データベースを照会話していたいくつかの例を踏襲しています

そのdirtyFlagの値を '0'に戻すのは誰ですか?

もし私がそれをしなければならない場合、同じことをする電話機上に複数のアプリケーションがあると言うことができます。私のアプリケーションが情報にアクセスしようとする前に、フラグを '0'に設定するアプリケーションがあるとします。私はすべての変更を見逃すことになるでしょう。

アプローチ3:

クエリのデータベースと私自身のデータベースにと「バージョン」は、接触の変化としてそれを考慮して変更された場合、各連絡先のversionを追跡します。これは重いプロセスのようです。

最後に私の質問は、ユーザーのデバイスの 連絡先の変更を聞くための最良の方法は何ですか?あなたは何ができるか

答えて

0

は(おそらくローカルMySqlデータベースを使用して)Contacts.LOOKUP_KEYとそのRawContacts.VERSION値の間のマッピングを持続しています。

あなたはすべてのRawContacts.VERSION秒間照会および変更が(onChange経由)Contacts DBで起こった放送を得れば彼らのContacts.LOOKUP_KEYをし、あなたがそれらのいずれかが変更された場合は、あなたがしたい、前に持続している状態にそれを比較連絡先が変更されたことを知る。

+0

これは私の質問と同様に3番目のアプローチです。 – Prakash

+1

うん、それは私がやっていることなので、それほど重いプロセスではなく、すべての連絡先を調べるクエリがなければこれを行う方法はありません。 – marmor

+0

「registerContentObserver(ContactsContract.Contacts.CONTENT_URI)」コールのトリガーが最も小さいたびに、連絡先全体のクエリーを実行して、何が変更されたかを確認する必要があります。 –

関連する問題