使用enum/bitwise将JavaOfWeek存储为sqlite数据库中的单个整数 - Java

bbe*_*ard 1 java sqlite enums casting bit-manipulation

这就是我想要做的.我有一个每周包含多天的字段.(例如,它可以存储星期一或星期一|星期二,或星期三|星期五) - 基本上任何组合.

为此,我使用了权力为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我在数据库中存储一个整数,如下所示:

DayOfWeek days = DayOfWeek.Monday | DayOfWeek.Thursday; // Monday and Thursday
int daysAsInt = (DayOfWeek)days; // Value to save
Run Code Online (Sandbox Code Playgroud)

我可以测试这些日子

if ((days & DayOfWeek.Monday) == DayOfWeek.Monday) /* If days contains Monday */
Run Code Online (Sandbox Code Playgroud)

我的问题是我不知道如何将整数值转换回DayOfWeek.我以为我可以施展它(DayOfWeek)daysAsInt.但它不起作用.

任何建议将非常感激.

Jon*_*eet 7

你的枚举是一周中的每个日子 - 类型的变量DayOfWeek应该只指一天.如果您尝试存储多个值,则应该查看EnumSet:

EnumSet<DayOfWeek> days = EnumSet.of(DayOfWeek.Monday, DayOfWeek.Wednesday);
int valueToStore = setToValue(days);
Run Code Online (Sandbox Code Playgroud)

后来:

int valueRetrieved = ...;
EnumSet<DayOfWeek> days = valueToSet(days);
Run Code Online (Sandbox Code Playgroud)

这些方法声明为:

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

static EnumSet<DayOfWeek> 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;
}
Run Code Online (Sandbox Code Playgroud)