zoukankan      html  css  js  c++  java
  • 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;
                });
    
            }
    
        }
  • 相关阅读:
    BZOJ 1046: [HAOI2007]上升序列(LIS)
    BZOJ 1001: [BeiJing2006]狼抓兔子(最短路)
    UVa 12299 RMQ with Shifts(线段树)
    NOIP2010提高组] CODEVS 1069 关押罪犯(并查集)
    [NOIP2001提高组]CODEVS1014 Car的旅行路线(最短路)
    scp 远程文件拷贝命令
    mysql yum源安装极速
    ssh pubkey免密登陆远程主机
    paramiko linux pip18.1
    python3 linux
  • 原文地址:https://www.cnblogs.com/devin_zhou/p/8488198.html
Copyright © 2011-2022 走看看