5

内部 Android カレンダーとアプリケーションの間で同期したいと考えています。Android API 14 以降で利用可能な Cal​​endarContract を使用しています。

コンテンツ プロバイダー「com.android.calendar」を変更すると、同期アダプターの onPerformSync(..) が呼び出されます。ただし、この時点では、イベントのすべての行が DIRTY = 0 に設定されています。つまり、Google カレンダーの同期では、同期アダプターがそれらにアクセスできるようになる前に、DIRTY FLAG を 0 に設定する必要があります。

CalendarContract.EventsColumns.SYNC_DATA1 - SYNCDATA10 は、同期アダプターで使用するためのコンテンツ プロバイダーの列と呼ばれます。これらの列の用途について何らかの規則があるかどうかは誰にもわかりませんか? 私のデバイスでは、SYNC_DATA5 に最終更新日が保存され、SYNC_DATA1 に Google イベント ID が保存されているようです。そのため、カレンダー アプリが Google カレンダーと同期するたびに、これらの列が変更されるようです。

ただし、これらの列のいずれかを同期アダプターに使用することを選択した場合、別のアプリケーションがまったく同じ列を使用せず、それらが互いにオーバーライドしないようにするにはどうすればよいでしょうか?

Google カレンダーが SYNC_DATA5 を常に使用して最終更新日を保存している場合、それを同期ロジックに使用するだけで問題ありません。これが規則であることを確認する必要があります。

4

1 に答える 1

2

列は任意のSYNC_DATA値に使用できます。Googleカレンダーがそれをどのように行うかはわかりませんが、それらは同期アダプターに関連するものであり、カレンダーを同期しないアプリケーションはそれらを使用してはなりません. そのため、カレンダーで動作する他の同期アダプターが存在してはならないため、どの列を使用しても安全です (アプリケーションのバージョン間で列を変更しない場合、または移行コードを記述する必要がある場合)。

同期アダプターでない場合は列に依存できませんSYNC_DATA。カレンダーが「自分のもの」でない場合は列を使用しないでください。


しかし、あなたが正しく同期していないことを強く感じています。カレンダーを同期するには、Google やその他のサードパーティ アプリによって同期されたカレンダーではなく、別のカレンダーを使用する必要があります。また、あなたが実行したと思われる関連する他の手順もいくつかリストしますが、他の人にとっては役立つかもしれません.

また、同期アダプター フィールドにアクセスできるように、システムの要求にいくつかのパラメーターを追加する必要があります。また、AbstractThreadedSyncAdapter実装からのみカレンダーを同期する必要があります。そのためには、オーセンティケーターをまだ持っていない場合は、オーセンティケーターも提供する必要があります (そのため、ユーザーはアカウントの同期設定で同期アダプターを有効/無効にできます)。同期アダプターの概要については、このブログ投稿 を参照してください。

サーバー側のアカウントがなく、カレンダーが 1 つしかない場合は、初めて起動するときにいくつかのことを行う必要があります。

  1. アカウントを作成する
  2. そのアカウントにバインドされたカレンダーを作成する
  3. 同期アダプターを有効にする

その後、Android は同期アダプターの実行を随時処理し、SYNC_DATA(作成したカレンダーで) 衝突することなく列にアクセスでき、DIRTYフラグが適切に提供されます。

于 2013-09-19T22:21:08.120 に答える