Esempio n. 1
0
        /// <summary>
        /// Sync with cloud data
        /// </summary>
        /// <returns></returns>
        public async Task <NoteList> Sync()
        {
            await Task.Delay(700);

            var cloud = await Download();

            if (cloud == null || cloud.Notes == null || cloud.Notes.Count == 0)
            {
                return(dat);
            }

            foreach (var lnote in dat.Notes)
            {
                if (cloud.Contains(lnote))
                {
                    var cnote = cloud.Get(lnote);
                    foreach (var ckey in cnote.UniversalData.Keys)
                    {
                        var clist = cnote.UniversalData[ckey];
                        var llist = lnote.UniversalData.GetValueOrDefault(ckey, true, k => new List <NoteHistRecord>());
                        foreach (var ch in clist)
                        {
                            var lh = llist.Find(a => Math.Abs((a.DT - ch.DT).TotalSeconds) < 1);
                            if (lh == null)
                            {
                                llist.Add(ch);  // Add cloud only data to local storage
                            }
                            else
                            {
                                if (lh.Value.Equals(ch.Value) == false)
                                {
                                    llist.Add(ch);  // Fail safe 同じ時間なのに値が違うレコードはローカルに追加
                                }
                            }
                        }
                        llist.Sort((a, b) => a.DT.CompareTo(b.DT));
                    }
                }
            }

            // save cloud only data
            foreach (var cnote in cloud.Notes)
            {
                if (dat.Contains(cnote) == false)
                {
                    dat.Add(cnote);
                }
            }

            Save();
            await Upload();

            return(dat);
        }