bmob根据时间排序分页查询多条数据

来源:互联网 发布:win10电脑mac地址查询 编辑:程序博客网 时间:2024/06/14 16:52
       bmobObject默认有createdAt,updatedAt时间字段,保存这个bmobObject对象的生成时间和更新时间。
       bmob开发文档的时间查询示例为:

       如果想查询指定日期之前的数据,则可以使用addWhereLessThan或者addWhereLessThanOrEqualTo(包含当天)来查询。
       如果想查询指定日期之后的数据,则可以使用addWhereGreaterThanaddWhereGreaterThanOrEqualTo(包含当天)来查询。

       目前有一个需求要按照updatedAt从现在到从前的顺序查询多个数据,假设每次查询返回的最大数据量有限制为100条,查询返回的数据列表为ListA。每次查询则根据addWhereLessThan(ListA内元素中updatedAt最早的时间)进行查询。
       问题的难点在于bmob后台保存的时间精确到微秒,而bmob数据库向api开发的时间精度到秒,2016-01-05 20:20:18
        这样一来就会出现一种情况,假如在2016-01-05 20:20:17秒有90条数据,2016-01-05 20:20:18有20条数据,前端通过 
       
BmobQuery<MyOrder> query = new BmobQuery<MyOrder>();String end ="2016-01-05 20:20:17";SimpleDateFormat sdf1 =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date1  =null;try{date1 = sdf1.parse(end);}catch(ParseException e){e.printStackTrace();}query .addWhereLessThanOrEqualTo("updatedAt",newBmobDate(date1));


        程序执行后会得到2016-01-05 20:20:17 的90条数据以及2016-01-05 20:20:18的前10条数据,而后10条将不会被查询到。原因在于通过这种方式查询的时间精度是秒,下一次的查询的是早于2016-01-05 20:20:18的时间,而剩余的2016-01-05 20:20:18内毫秒级别精度的数据将不会被获得。


解决办法就是第二次查询通过获取 (2016-01-05 20:20:18 - 2016-01-05 20:20:19)的所有数据以及早于(2016-01-05 20:20:18)的所有数据,并与之前获得的数据进行比较,去除重复的。

private BmobQuery<MyOrder> getStateMoreQuery()
{
ArrayList<MyOrder> list = (ArrayList<MyOrder>)adapterMyOrder.getList();
MyOrder order = list.get(list.size() - 1);
BmobQuery<MyOrder> query = new BmobQuery<MyOrder>();
BmobQuery<MyOrder> q1 = new BmobQuery<MyOrder>();
BmobQuery<MyOrder> q2 = new BmobQuery<MyOrder>();
q1.addWhereLessThanOrEqualTo("updatedAt", ServerUtil.getBmobDateBigger1sec(order.getUpdatedAt()))//date.setTime(date.getTime() + 1000);
q1.addWhereGreaterThanOrEqualTo("updatedAt", ServerUtil.getBmobDate(order.getUpdatedAt()));
q2.addWhereLessThan("updatedAt", ServerUtil.getBmobDate(order.getUpdatedAt()));

List<BmobQuery<MyOrder>> querys = new ArrayList<BmobQuery<MyOrder>>();
querys.add(q1);
querys.add(q2);
query.or(querys);
return query;
}

1 0
原创粉丝点击