我正在使用 Realm 在本地存储数据。
我想获取特定月份的数据。即仅显示一月份的数据。
字段类型为日期。
在 Sqllite 中我们可以使用 strftime('%m', column_name) = '05'; 但在 realm 中找不到任何解决方案。
谢谢。
最佳答案
您需要设置日期为 1 月 1 日(年)00:00:00:000 和日期 2 月 1 日(年)00:00:00:000(例如使用日历 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();
关于android - 使用 Realm 查询给定月份的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39676647/