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);

现在我想更新我的扩展属性,假设用“valueB”替换“valueA”,这就是我所做的:

// 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 回答