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

时间:2014-03-05 17:23:27

标签: java sqlite casting enums 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;
    }
}

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

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。我以为我可以施展它(DayOfWeek)daysAsInt。但它不起作用。

非常感谢任何建议。

2 个答案:

答案 0 :(得分:7)

您的枚举属于个人天的日期 - 类型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;
}

答案 1 :(得分:0)

由于整数可能包含多天,因此您不能简单地将整数转换回单个DayOfWeek实例,而是必须返回DayOfWeek元素的数组/集/列表。

要做到这一点,你可以在DayOfWeek中提供一个静态方法,并检查每个“索引”的int(这不是一个索引,而是一个标志/ id)。