Android日历提供程序:只有最初在设备上创建扩展属性同步,所有进一步的更新都不会同步

时间:2016-03-02 01:30:00

标签: android google-api google-calendar-api extended-properties

当我创建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"。当我尝试将另一个扩展属性添加到同一事件时,我可以观察到相同的行为 - 我只能在当前设备上看到两个扩展属性。新的扩展属性永远不会同步。

任何人都可以帮助了解我做错了什么吗?我需要能够为事件添加多个扩展属性,以及稍后编辑这些属性。

P.S。我可以将多个扩展属性附加到循环中的新事件,而不是附加一个单独的初始扩展属性,它们将在设备上成功同步:

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

因此,仅当我尝试更新现有属性或添加(不是在循环中同时!)新属性到已经具有&#34; initial&#34;的事件时,才会出现同步问题。扩展属性。

2 个答案:

答案 0 :(得分: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

有关增量同步的详细信息,请点击以下链接:$all

答案 1 :(得分:0)

解释很简单。同步适配器所做的所有更改(包括插入/更新扩展属性)都不会通过标准的Android同步机制自动与Google服务器同步。因此,如果您需要同步扩展属性本地更改,则需要将相关的本地事件设置为脏(不是通过设置CalendarContract.Events.DIRTY=1,因为它还需要使用同步适配器;运行ContentResolver.insert/update而不进行任何实际更改是足够)。由于事件现在很脏并且事件更改不是来自同步适配器,因此Android将很快自动同步事件及其扩展属性。

在更新其扩展属性之前更新本地事件非常重要。如果您首先更新扩展属性,则Android完成同步后更改将会丢失。