使用objectbox查询本地时间

quhf5bfb  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(526)

我有两个问题,
如何使用objectbox保存localtime rage,例如:

class LocalTimeRage {
   LocalTime opens;
   LocalTime closes;
}

和2。如何使用objectbox查询本地时间范围,例如,查询与 opens 以及 closes localtime值,例如,查询在上午07:00到晚上8:00(localtime)之间打开的对象,因为objectbox将返回打开和关闭时间与范围匹配的对象。

l0oc07j2

l0oc07j21#

这是基于objectbox v2.8.1的。
objectbox支持相对有限的内置类型列表。这份名单不包括任何现代的 java.time 类,但我们可以使用objectbox @Convert 注解。
我认为最好是完全避免旧的和有问题的 Date 类,因此此示例将 LocalDateTime 值到long(但是, Date 是其内置支持的类型之一):

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 对纳秒的支持。)

相关问题