2014-07-10 72 views
1

我正在做两个列表之间的同步。 IList<Event> GoogleEventsTable<myEvent> DB.Events;两个列表同步

在谷歌方面我使用this

String Summary, 
String Description, 
EventDateTime Start, 
EventDateTime End, 
Event.RemindersData Reminders; 

分贝的侧像这样

Db event

我的代码是这样的

foreach (myEvent item in DB.Events) 
{ 
    if (item.GoogleID == "" || item.GoogleID == null)// i add event my db 
    { 
     //Add dbEvent to google and save id to googleid column 
    } 
} 

foreach (Event item in myGoogleCalendar.Items) 
{ 
    if (DB.Events.Where(o => o.GoogleID == item.Id).Count() == 0)// i add event google 
    { 
     //Add googleEvent to dbEvent 
    } 
    else 
    { 
     //This event also existing in two server 
     myEvent dbEvent = DB.Olaylar.Where(o => o.GoogleID == item.Id).First(); 
     if(item.Updated.Value == dbEvent.UpdateTime) continue;//Same 

     if (item.Updated.Value > dbEvent.UpdateTime) 
     { 
      //Google event is new 
     } 
     else 
     { 
      //dbEvent is new 
     } 

    } 

} 

有一个很大的问题我忘了删除

我应该在哪里添加删除事件部分又如何呢?

回答

3

问题不是实现删除同步,而是要识别事件是否已在一个列表中删除或添加到另一个列表中。

我建议不要从DB.Events列表中删除事件,而是将它们标记为已删除。

因此,你需要在你myEvent类型的标志

bool IsDeleted = false; 

在Google列表中(我假设您使用的是https://developers.google.com/google-apps/calendar/v3/reference/events),您没有这样的标志。所以你的算法需要有点棘手。

让你从谷歌名单

foreach (Event item in myGoogleCalendar.Items) 
{ 
    if (DB.Events.Where(o => o.GoogleID == item.Id).Count() == 0) 
    { 
     // create new DB event from Google event, because since it is 
     // not in the DB.Events list, it has not been deleted there earlier, 
     // else there would be an event with IsDeleted=true 
    } 
    else 
    { 
     //This event exists in both 
     myEvent dbEvent = DB.Events.Where(o => o.GoogleID == item.Id).First(); 
     if (dbEvent.IsDeleted) 
     { 
      // delete Google event, since the flag in DB.Events list shows that 
      // it existed earlier and has been deleted in DB.Events list. 
     } 
     else 
     { 
      if(item.Updated.Value == dbEvent.UpdateTime) continue;//Same 

      if (item.Updated.Value > dbEvent.UpdateTime) 
      { 
       // update DB event 
      } 
      else 
      { 
       // update Google event 
      } 
     } 
    } 
} 

然后您同步从DB.Events列表

foreach (myEvent item in DB.Events) 
{ 
    if (!item.IsDeleted && string.IsNullOrEmpty(item.GoogleID)) 
    { 
     // Create new Google Event from DB event 
    } 
    else if (!item.IsDeleted && !string.IsNullOrEmpty(item.GoogleID)) 
    { 
     // Mark DB event as deleted 
     item.IsDeleted = true; 
    } 
} 

这个工程中的方案首先需要的同步

  • 创建数据库中的事件
  • 您可以在谷歌
  • 您在DB
  • 删除事件你在谷歌
+0

首先谢谢你的回答。我想过这样的事情。我不明白'else if(!item.IsDeleted &&!string.IsNullOrEmpty(item.GoogleID))'块。如果我的数据库中的事件有googleID'isDeleted flag = true;'但为什么不检查不在谷歌。 **的确我不能修改数据库。也许这将工作。但是,如果db改变了一切,那么就会发生变化。** – Abdullah

+0

如果事件的GoogleID不为空或为空,则表明它曾经存在于Google中。由于它已不在Google中,因此它已被删除,因此必须标记为已删除。 – Job

1

删除事件我创建了一个要点:https://gist.github.com/ricjac/947991ba96488c640bfe

 // Prepare DTO to delta 
     var mergeDict = DeltaExtensions.MergeDictionary(
      sourceIEnum,  //Source 
      destinationIEnum, //Destination 
      s => s.SomeIdKey, 
      d => d.SomeIdKey); 

     // Get the delta between the two 
     var mergeDelta = DeltaExtensions.GetMergeDelta(mergeDict); 

     // You now have the delta of the two: 
     mergeDelta.InsertedOnly 
     mergeDelta.DeletedOnly 
     mergeDelta.Inserted 
     mergeDelta.Updated 
     mergeDelta.Deleted 
+0

我喜欢它太多,绝对合理,但有点延迟 – Abdullah