【问题标题】:Querying data for a given month using Realm使用 Realm 查询给定月份的数据
【发布时间】:2016-09-24 13:05:33
【问题描述】:

我正在使用领域将数据存储在本地。

我想获取特定月份的数据。即仅显示一月份的数据。

字段类型为日期。

在 Sqllite 中我们可以使用 strftime('%m', column_name) = '05'; 但在领域找不到任何解决方案。

谢谢。

【问题讨论】:

  • 某一年的一月?
  • @EpicPandaForce 我不想与年份进行比较,因为我想以月份为基础显示数据。

标签: android database realm


【解决方案1】:

您需要为 1 月 1 日(年)00:00:00:000 和 2 月 1 日(年)00:00:00:000 设置日期(例如使用 Calendar API),并且使用

RealmResults<Obj> results = realm.where(Obj.class)
        .greaterThanOrEqualTo("date", januaryDate)
        .lessThan("date", februaryDate)
        .findAllSorted("date", Sort.ASCENDING);

编辑:好的,查询“基于月份”并不是那么简单。默认只能查询时间间隔等日期。

不过,您有多种选择:

1.) 为您的最小日期和最大日期之间给定月份的所有可能年份构建一个查询。

public class Obj extends RealmObject {
    @Index
    private Date date;

    //getters, setters
}

然后

Date minimumDate = realm.where(Obj.class).minimumDate();
Date maximumDate = realm.where(Obj.class).maximumDate();
Calendar minCalendar = Calendar.getInstance();
Calendar maxCalendar = Calendar.getInstance();
if(minimumDate == null) {
    minimumDate = new Date();
}
if(maximumDate == null) {
    maximumDate = new Date();
}
minCalendar.setTime(minimumDate);
maxCalendar.setTime(maximumDate);
int minimumYear = minCalendar.get(Calendar.YEAR);
int maximumYear = maxCalendar.get(Calendar.YEAR);
Calendar transientCalendar = Calendar.getInstance();
transientCalendar.set(Calendar.DAY_OF_MONTH, 1);
transientCalendar.set(Calendar.HOUR_OF_DAY, 0);
transientCalendar.set(Calendar.MINUTE, 0);
transientCalendar.set(Calendar.SECOND, 0);
transientCalendar.set(Calendar.MILLISECOND, 0);

RealmQuery<Obj> query = realm.where(Obj.class);
boolean isFirst = true;
for(int i = minimumYear; i <= maximumYear; i++) {
   if(isFirst) {
      isFirst = false;
   } else {
      query.or();
   }
   query.beginGroup();
   transientCalendar.set(Calendar.YEAR, i);
   transientCalendar.set(Calendar.MONTH, Calendar.JANUARY);
   query.greaterThanOrEqualTo("date", transientCalendar.getTime());
   transientCalendar.set(Calendar.MONTH, Calendar.FEBRUARY);
   query.lessThan("date", transientCalendar.getTime());
   query.endGroup();
}
// then you can do
RealmResults<Obj> results = query.findAllSorted("date", Sort.ASCENDING);

2.) 根据您设置的日期更新模型中包含月份的字段。

public class Obj extends RealmObject {
    private Date date;

    @Index
    private String month;

    public String getMonth() {
        return month;
    }

    @Deprecated
    public void setMonth(String month) {
        this.month = month;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
        if(date == null) {
            this.month = null;
        } else {
            this.month = new SimpleDateFormat("MMMMM", Locale.US).format(date);
        }
    }
}

那你就可以了

RealmResults<Obj> results = realm.where(Obj.class).equalTo("month", "January").findAll();

【讨论】:

  • 我不想与年份进行比较,因为我想以月份为基础显示数据。
  • 啊,没那么简单。但我编辑我的答案是为了好玩
  • 谢谢@EpicPandaForce。让我试试……哪个更方便
  • 我个人觉得第二个容易多了。
  • 是应用了第二个逻辑。但我必须在所有有日期字段的模型中都这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 2019-02-02
  • 1970-01-01
  • 2021-09-12
  • 2016-09-02
  • 2019-01-29
相关资源
最近更新 更多