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; }); } }