1

Google カレンダー イベントを作成して拡張プロパティを添付すると、すべてが期待どおりに機能します。イベントとその拡張プロパティの両方が同期されるため、さまざまなデバイスからアクセスできます。コードは次のとおりです。

// create event with extended property
ContentValues values = new ContentValues();
...
values.put(CalendarContract.Events.HAS_EXTENDED_PROPERTIES, 1);
Uri eventURI = contentResolver.insert(CalendarContract.Events.CONTENT_URI, values);
long eventID = Long.parseLong(eventURI.getLastPathSegment());

Uri extendedPropertyURI = CalendarContract.ExtendedProperties.CONTENT_URI;
extendedPropertyURI = extendedPropertyURI.buildUpon()
    .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
    .appendQueryParameter(CalendarContract.Events.ACCOUNT_NAME, "...")
    .appendQueryParameter(CalendarContract.Events.ACCOUNT_TYPE, "com.google").build();

ContentValues extendedValues = new ContentValues();
extendedValues.put(CalendarContract.ExtendedProperties.EVENT_ID, eventID);
extendedValues.put(CalendarContract.ExtendedProperties.NAME, "name");
extendedValues.put(CalendarContract.ExtendedProperties.VALUE, "valueA");

contentResolver.insert(extendedPropertyURI, extendedValues);

ここで、拡張プロパティを更新したいと思います。たとえば、「valueA」を「valueB」に置き換えます。次のようにします。

// update extended property
int propertyID = 123; // got this ID from CalendarContract.ExtendedProperties._ID, let me omit the code
ContentValues updatedValues = new ContentValues();
updatedValues.put(CalendarContract.ExtendedProperties.VALUE, "valueB");
Uri updateUri = ContentUris.withAppendedId(extendedPropertyURI, propertyID);
contentResolver.update(updateUri, updatedValues, null, null);

拡張プロパティの値が正常に更新され、更新が実行されたデバイスに「valueB」が表示されます。ただし、Google カレンダー サーバーとは同期しないため、他のデバイスでは常に「valueA」が表示されます。別の拡張プロパティを同じイベントに追加しようとすると、同じ動作を観察できます。現在のデバイスでのみ両方の拡張プロパティを確認できます。新しい拡張プロパティは同期されません。

誰かが私が間違っていることを理解するのを手伝ってもらえますか? 複数の拡張プロパティをイベントに追加し、これらのプロパティを後で編集できるようにする必要があります。

PS 単一の初期拡張プロパティをアタッチする代わりに、ループ内の新しいイベントに複数の拡張プロパティをアタッチできます。それらはすべてデバイス間で正常に同期されます。

for (int i = 0; i < 10; i ++) {
    ContentValues extendedValues = new ContentValues();
    extendedValues.put(CalendarContract.ExtendedProperties.EVENT_ID, eventID);
    extendedValues.put(CalendarContract.ExtendedProperties.NAME, "name");
    extendedValues.put(CalendarContract.ExtendedProperties.VALUE, "value" + i);

    contentResolver.insert(extendedPropertyURI, extendedValues);
}

したがって、同期の問題は、既存のプロパティを更新しようとしたり、(ループで同時にではなく) 新しいプロパティを「初期」拡張プロパティが既にあるイベントに追加しようとした場合にのみ発生します。

4

2 に答える 2

1

説明は簡単です。同期アダプターによって行われたすべての変更 (拡張プロパティの挿入/更新を含む) は、標準の Android 同期メカニズムによって自動的に Google サーバーと同期されません。したがって、拡張プロパティのローカル変更を同期する必要がある場合は、関連するローカル イベントをダーティにする必要があります (設定によってCalendarContract.Events.DIRTY=1ではなく、同期アダプターを使用する必要があるためContentResolver.insert/update、実際の変更なしで実行するだけで十分です)。イベントは現在ダーティであり、イベントの変更は同期アダプターからのものではないため、Android はすぐにイベントとその拡張プロパティの両方を自動的に同期します。

拡張プロパティを更新する前に、ローカル イベントを更新することが重要です。最初に拡張プロパティを更新すると、Android が同期を完了すると変更が失われます。

于 2016-04-23T13:34:51.620 に答える
0

「増分同期」を使用して繰り返し実行し、前回の同期以降に発生したすべての変更でクライアントを更新できます。これを行うには、 syncTokenフィールドで指定された最新の同期トークンを使用してリスト リクエストを実行する必要があります。

元のクエリ

GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx

// Result contains the following

"nextPageToken":"CiAKGjBpNDd2Nmp2Zml2cXRwYjBpOXA",

次のページを取得しています

GET /calendars/primary/events?maxResults=10&singleEvents=true&syncToken=CPDAlvWDx70CEPDAlvWDx&pageT

増分同期の詳細については、次のリンクをたどってください: https://developers.google.com/google-apps/calendar/v3/sync#incremental_sync

于 2016-03-03T08:34:34.180 に答える