Xamarin.Forms中使用LiteDB分页

Xamarin.Forms中使用LiteDB分页

 

在移动应用的开发中,为力提高用户体验,一般都会在本地设计一套数据缓存。这里我使用的是LiteDB来缓存数据。

LiteDB是.Net平台的一个开源的NoSQL文件数据库,

开源库地址:https://github.com/mbdavid/LiteDB。

NuGet地址:https://www.nuget.org/packages/LiteDB/。

对于分页,首先我们要解决三个问题:1. 查询条件、2. 排序、3. 分页。

1. 查询条件这里就不讲了。

2. 排序:由于LiteDB是NoSQL的,所以不支持内部直接排序了,那么配合Linq的OrderBy或者OrderByDescending即可以实现。

3. 分页:我想到的是使用linq的skip方法来跳过一些记录。

看例子:

数据类型:

    public class MessageBean
   {
        public string Id { get; set; }
        
        public DateTime SendTime { get; set; }

        public int MsgType { get; set; }

        public long ConversationId { get; set; }

        public bool IsSendSuccess { get; set; }

        public string SenderId { get; set; }

        public string MessageJsonContent { get; set; }
    }

分页:根据MessageBean的SendTime进行分页。

public class MessagePageHelper
    {
        private DateTime pageTime;
        private const int limit = 10;
        private long ConversationId;

        public MessagePageHelper(long conversationId)
        {
            this.ConversationId = conversationId;
            pageTime = DateTime.UtcNow;
        }

        public Task<IEnumerable<MessageBean>> GetEarlierMessage()
        {
          return  Task<IEnumerable<MessageBean>>.Factory.StartNew(() => 
            {

                var date = new DateTime(1970, 1, 1, 0, 0, 0, 0);
                IEnumerable<MessageBean> result = null;
                var query0 = Query.LT("SendTime", pageTime);
                var query1 = Query.EQ("ConversationId", ConversationId);
                var query = Query.And(query0, query1);
                var datas = MessageDataService.Instance.Find(query);

                if (datas != null)
                {
                    datas = datas.OrderBy(x => ((x.SendTime - date).TotalMilliseconds));
                    int count = datas.Count();
                    int skip = count > limit ? count - limit : 0;
                    result = datas.Skip(skip);
                    if (result != null && result.Count() > 0)
                    {
                        pageTime = result.First<MessageBean>().SendTime;
                    }
                }
                return result;
            });

        }

    }

 

posted @ 2018-03-11 11:10  Devin.Zhou  阅读(572)  评论(0编辑  收藏  举报