两个日期对象的“之间”查询在Realm中返回错误的输出

时间:2016-05-10 11:40:36

标签: android realm realm-list

我正在使用时间戳(购买时完全相同的日期时间对象)存储购买交易。当我尝试从一个开始和提取结果中提取结果时结束日期,它给出了错误的结果。

以下是我正在存储的日期对象/格式的示例

27-01-2016
27-02-2016
10-05-2016
27-05-2016

这是在两个日期之间检索对象的查询,

RealmResults<Transactions> result = realm.where(Transactions.class)
                .between("timestamp", start, end)
                .findAll();

现在给出开始日期:01-01-16 &amp; ending_date:29-02-2016 ,它返回一个对象 “27-01-2016”这是不正确的。

我的查询中是否有任何遗漏?

2 个答案:

答案 0 :(得分:0)

我假设您的时间戳是字符串。在这种情况下,您正在错误地存储时间戳。在做&gt;或者&lt;在字符串上,与数字一样,你从左到右。 27介于01和29之间,所以后面的数字并不重要。

为了进行查询,您需要从最大值到最小值或YYYY-MM-DD进行查询,从左到右的方式实际上会正确比较。显然,您的开始和结束日期也必​​须采用该格式。你已经确定领先的0也很重要。

答案 1 :(得分:0)

对于最新的Realm版本,我们可以使用between(String fieldName, Date from, Date to)

如果您使用“ 2016年1月27日” 格式,请在保存date

之前重置此值
    Calendar cal = new GregorianCalendar();
            cal.setTime(date);
            cal.set(Calendar.HOUR_OF_DAY, 0);
            cal.set(Calendar.MINUTE, 0);
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);


   RealmObject.setDbDate(cal.getTime());

然后您可以查询,请确保正确设置startDateendDate范围

query.between(RealmObject.FIELD_DATE, startDate, endDate);

但是,有时between()是不够的,因为它不允许链接的对象,例如,当您搜索其子项(也包含日期的RealmObject)与日期范围匹配的所有项目时。

然后您可以使用greaterThanOrEqualTo(String fieldName, Date value)lessThanOrEqualTo(String fieldName, Date value)

             query.greaterThanOrEqualTo(RealmObject.FIELD_LINKED_OBJECT + "." + LinkedObject.FIELD_DATE, startDate)
                    .findAll()
                    .where()
                    .lessThanOrEqualTo(RealmObject.FIELD_LINKED_OBJECT + "." + LinkedObject.FIELD_DATE, endDate)
                    .findAll();