我有两个问题,如何使用objectbox保存localtime rage,例如:
class LocalTimeRage { LocalTime opens; LocalTime closes; }
和2。如何使用objectbox查询本地时间范围,例如,查询与 opens 以及 closes localtime值,例如,查询在上午07:00到晚上8:00(localtime)之间打开的对象,因为objectbox将返回打开和关闭时间与范围匹配的对象。
opens
closes
l0oc07j21#
这是基于objectbox v2.8.1的。objectbox支持相对有限的内置类型列表。这份名单不包括任何现代的 java.time 类,但我们可以使用objectbox @Convert 注解。我认为最好是完全避免旧的和有问题的 Date 类,因此此示例将 LocalDateTime 值到long(但是, Date 是其内置支持的类型之一):
java.time
@Convert
Date
LocalDateTime
import java.time.LocalTime; import io.objectbox.annotation.Entity; import io.objectbox.annotation.Id; import io.objectbox.annotation.Convert; import io.objectbox.converter.PropertyConverter; @Entity public class LocalTimeRange { @Id private long id; @Convert(converter = LocalTimeConverter.class, dbType = Long.class) private LocalTime opens; @Convert(converter = LocalTimeConverter.class, dbType = Long.class) private LocalTime closes; public static class LocalTimeConverter implements PropertyConverter<LocalTime, Long> { @Override public LocalTime convertToEntityProperty(Long databaseValue) { if (databaseValue == null) { return null; } return LocalTime.ofSecondOfDay(databaseValue); } @Override public Long convertToDatabaseValue(LocalTime entityProperty) { if (entityProperty == null) { return null; } long seconds = (entityProperty.getHour() * 60 * 60) + (entityProperty.getMinute() * 60) + entityProperty.getSecond(); return seconds; } } public LocalTimeRange(Long id) { this.id = id; } public LocalTimeRange(long id, LocalTime opens, LocalTime closes) { this.id = id; this.opens = opens; this.closes = closes; } public LocalTimeRange() { } // getters and setters not shown }
现在我们可以创建和存储几个测试对象:
BoxStore store = MyObjectBox.builder().name("objectbox-demo-db").build(); Box<LocalTimeRange> box = store.boxFor(LocalTimeRange.class); // start with no objects: box.query().build().remove(); // add two objects: LocalTimeRange ltrOne = new LocalTimeRange(1, LocalTime.of(9, 30, 0), //9:30:00 (9:30am) LocalTime.of(10, 15, 0)); box.put(ltrOne); LocalTimeRange ltrTwo = new LocalTimeRange(2, LocalTime.of(10, 05, 0), LocalTime.of(11, 45, 0)); box.put(ltrTwo);
然后我们可以查询数据存储:
// this will find both objects: LocalTime testTime = LocalTime.of(10, 10, 0); // this will find the 2nd object //LocalTime testTime = LocalTime.of(10, 20, 0); // convert the localtime to seconds: Long seconds = localTimeToSeconds(testTime); List<LocalTimeRange> localTimeRanges = box.query() .less(LocalTimeRange_.opens, seconds) .greater(LocalTimeRange_.closes, seconds) .build().find(); for (LocalTimeRange ltr : localTimeRanges) { System.out.println(ltr.toString()); } store.close(); --- private static long localTimeToSeconds(LocalTime lt) { return (lt.getHour() * 60 * 60) + (lt.getMinute() * 60) + lt.getSecond(); }
查询运算符的可处理类型也有限制:
less(LocalTimeRange_.opens, seconds)
在这里, seconds 是一个 long -因为没有一个查询操作符采用我们想要使用的java类型( LocalTime ).您可能希望改进我的示例,以确保恰好落在某个边界值上的测试时间得到正确处理(例如,没有“小于或等于”查询方法)。您可以使用 equal() , and() , or() ,等等。(这种方法处理 LocalTime 最接近的一秒。如果您想要次秒精度,您需要更新逻辑以包括 LocalTime 对纳秒的支持。)
seconds
long
LocalTime
equal()
and()
or()
1条答案
按热度按时间l0oc07j21#
这是基于objectbox v2.8.1的。
objectbox支持相对有限的内置类型列表。这份名单不包括任何现代的
java.time
类,但我们可以使用objectbox@Convert
注解。我认为最好是完全避免旧的和有问题的
Date
类,因此此示例将LocalDateTime
值到long(但是,Date
是其内置支持的类型之一):现在我们可以创建和存储几个测试对象:
然后我们可以查询数据存储:
查询运算符的可处理类型也有限制:
在这里,
seconds
是一个long
-因为没有一个查询操作符采用我们想要使用的java类型(LocalTime
).您可能希望改进我的示例,以确保恰好落在某个边界值上的测试时间得到正确处理(例如,没有“小于或等于”查询方法)。您可以使用
equal()
,and()
,or()
,等等。(这种方法处理
LocalTime
最接近的一秒。如果您想要次秒精度,您需要更新逻辑以包括LocalTime
对纳秒的支持。)