首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ObjectBox查询本地时间

用ObjectBox查询本地时间
EN

Stack Overflow用户
提问于 2020-12-12 09:55:19
回答 1查看 312关注 0票数 1

我有两个问题,

  1. 例如,如何使用LocalTime来保存ObjectBox的狂怒:
代码语言:javascript
复制
class LocalTimeRage {
   LocalTime opens;
   LocalTime closes;
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-12 22:53:39

这是基于ObjectBox v2.8.1的。

ObjectBox支持相对有限的内建类型列表。该列表不包括任何现代java.time类,但我们可以使用ObjectBox 注解

我认为最好完全避免老生常谈 Date类,因此这个示例将LocalDateTime值转换为longs (然而,Date是它们支持的内置类型之一):

代码语言:javascript
复制
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

}

现在我们可以创建和存储几个测试对象:

代码语言:javascript
复制
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);

然后我们可以查询数据存储:

代码语言:javascript
复制
// 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();
}

查询运算符在它们能够处理的类型中也受到限制:

代码语言:javascript
复制
less(LocalTimeRange_.opens, seconds)

在这里,seconds是一个long --因为没有采用我们想要使用的long类型的查询操作符(LocalTime)。

您可能希望改进我的示例,以确保正确地处理掉在其中一个边界值上的测试时间(例如,没有“小于或等于”查询方法)。您可以使用equal()and()or()等构建更复杂的查询。

(此方法将LocalTime处理到最近的秒。如果您希望获得亚秒级的精度,则需要更新逻辑以包括LocalTime对纳秒的支持。)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65263595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档