使用枚举/按位存储DaysOfWeek在SQLite数据库单个整数 - 的Java(Storing

2019-10-19 11:58发布

这里就是我想要做的事。 我有一个每周涵盖多天的现场。 (例如,它可以存储或MONDAY MONDAY |星期二,星期三或|星期五) - 基本上任何组合。

要做到这一点我用2的幂,像这样的枚举:

public enum DayOfWeek {
    Monday(1),
    Tuesday(2),
    Wednesday(4),
    Thursday(8),
    Friday(16),
    Saturday(32),
    Sunday(64);

    private final int index;

    DayOfWeek(int index) {
        this.index = index;
    }

    public int value() {
        return index;
    }
}

然后,我存储在这样的数据库中的一个整数:

DayOfWeek days = DayOfWeek.Monday | DayOfWeek.Thursday; // Monday and Thursday
int daysAsInt = (DayOfWeek)days; // Value to save

我可以测试日内这样

if ((days & DayOfWeek.Monday) == DayOfWeek.Monday) /* If days contains Monday */

我的问题是我不知道怎么去转换回星期几是整数值。 我以为我可以投它(DayOfWeek)daysAsInt 。 但是,这是行不通的。

任何建议将非常赞赏。

Answer 1:

您枚举是一周的天-类型的变量DayOfWeek只应有望指一天。 如果你想存储多个值,你应该看看一个EnumSet

EnumSet<DayOfWeek> days = EnumSet.of(DayOfWeek.Monday, DayOfWeek.Wednesday);
int valueToStore = setToValue(days);

后来:

int valueRetrieved = ...;
EnumSet<DayOfWeek> days = valueToSet(days);

其中这些方法被声明为:

static int setToValue(EnumSet<DayOfWeek> days) {
    int value = 0;
    for (DayOfWeek day : days) {
        value |= day.value();
    }
    return value;
}

static int valueToSet(int value) {
    EnumSet<DayOfWeek> days = EnumSet.noneOf(EnumSet.class);
    for (DayOfWeek day : EnumSet.allOf(EnumSet.class)) {
        if ((value & day.value()) != 0) {
            days.add(day);
        }
    }
    return days;
}


Answer 2:

由于整数可能包含多个日子里,你不能只是简单地转换整数回单DayOfWeek实例,但你必须返回数组/设置/列表DayOfWeek元素。

要做到这一点,你可以提供一个静态方法, DayOfWeek ,检查INT每个“指数”(这是不是一个真正的索引,而是一个标志/ ID)。



文章来源: Storing DaysOfWeek as single integer in sqlite database using enum/bitwise - Java