2016-03-02 4 views
0

Когда я создаю событие Календаря Google и прикрепляю к нему расширенное свойство, все работает как ожидается - синхронизируются как событие, так и его расширенное свойство поэтому к ним можно получить доступ с разных устройств. Вот код:Поставщик календаря для Android: только изначально созданных расширенных свойств синхронизаций между устройствами, все последующие обновления не синхронизируются

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

Теперь я хочу, чтобы обновить свою расширенную собственность, скажем, заменить «значение а» с «VALUE млрд», вот что я делаю:

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

Так что вопрос синхронизации происходит только когда я пытаюсь обновить существующее свойство или добавить (не в то же время в цикл!) новое свойство события, которое уже имеет «начальные» расширенные свойства.

+0

Помогает ли это? Http: // StackOverflow.com/questions/27293675/why-calendarprovider-doesnt-allow-writting-extendedproperties – luc

+0

Нет. Такое же поведение, когда я использую «настоящий» адаптер синхронизации: только начальные расширенные свойства, все дальнейшие действия (добавление, обновление, удаление) происходят на только для текущего устройства. – Zmiter

ответ

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

+0

Спасибо, но 1) Я использую CalendarProvider, а не GC API, и 2) я не верю, что инкрементная синхронизация может помочь - я могу легко синхронизировать любые изменения событий, кроме случаев с расширенными свойствами, описанными выше. – Zmiter

0

Объяснение простое. Все изменения, внесенные адаптером синхронизации (включая вставку/обновление расширенных свойств), не синхронизируются с серверами Google автоматически с помощью стандартного механизма синхронизации Android. Поэтому, если вам нужно синхронизировать локальное изменение расширенного свойства, вам необходимо сделать загрязнение связанного локального события (не путем установки CalendarContract.Events.DIRTY=1, так как для этого также требуется использование адаптера синхронизации, достаточно запустить ContentResolver.insert/update без каких-либо фактических изменений). Поскольку событие загрязнено сейчас, и изменение события происходит не из адаптера синхронизации, Android скоро синхронизирует как событие, так и его расширенные свойства в ближайшее время.

Важно обновить локальное событие перед обновлением его расширенных свойств. Если вы сначала обновите расширенные свойства, изменение будет потеряно после того, как Android завершит синхронизацию.

 Смежные вопросы

  • Нет связанных вопросов^_^