GMobileSync出现事件重复的bug

很奇怪,怎么今天才发现这个bug。
Outlook中新建一个Appointment,同步到Google
Calendar,然后马上再同步一次,Outlook中就会出现两个同样的事件,但第三次同步就不会出现更多的重复了。

调试之后找到了原因:
新建的Appointment同步到Google
Calendar时使用的queryUri是"http://www.google.com/calendar/feeds/default/private/full",
同步完返回的EventEntry的absoluteUri的形式为
http://www.google.com/calendar/feeds/default/private/full/9ess8r22fljetplumv3rkmfitk
然后程序把Appointment的id和EventEntry的absoluteUri存入GMobileSync.xml用于下次同步时使用。
在下一次的同步中,先从gCal中获取所有的Event,这个被新加到gCal的事件的absoluteUri将变成如下的形式:
http://www.google.com/calendar/feeds/username%40gmail.com/private/full/9ess8r22fljetplumv3rkmfitk
这样,在上次同步的列表中将找不到这个absoluteUri对应的Appointment
ID。于是程序误认为这是一个新Event,于是就在本地新建一个Appointment,然后把Appointment
ID和这个absoluteUri保存到GMobileSync.xml中。所以,第三次同步就不会再有重复。

不知道为何今天才发现这个错误,我之前的使用过程中不可能没出现过这样的操作,但是没遇到过这样的现象。难道Google Data
API调整了插入Event时的返回值?

解决办法比较简单,因为absoluteUri的改变不过是把default换成了你的email账号。你可以把absoluteUri存入GMobileSync.xml之前先手动把default转换一下。
不过我换了另外一个更简单的方式,只保存absoluteUri的最后一部分:9ess8r22fljetplumv3rkmfitk。
当然,理论上会有重复的可能。比如我的gCal中添加了别人的Calendar,那么下载下来的event可能和我Calendar里面的event有同样的后缀。
不过,概率太太太小了。

GMobileSync还有很多可以改进的地方,比如指定下载的Calendar以及指定默认把事件添加到哪个Calendar。
有空再加上这个功能。

Comments