我有一个类似
的枚举类public enum DutyState {
DRIVING(0),
ONDUTY(1),
OFFDUTY(2),
SLEEPER(3),
NOSTATE(-1);
private final int state;
private DutyState(int s) {
this.state = s;
}
}
我正在使用Dto作为状态
DutyState status;
public DutyState getStatus() {
return status;
}
public void setStatus(DutyState status) {
this.status = status;
}
我将此状态保存在数据库(Sqlite)
中Contentvalues cv=new ContentValues();
cv.put(STATUS,String.valueof(dto.getStatus()));
此处状态保存在数据库中。
当我从数据库中检索状态时,我遇到了一个问题。
我的代码是
dto.setStatus(c.getInt(c.getColumnIndex(TIME_STATUS)));
在我的Sqlite中,我为status创建了一个dataType
在dto中,它的返回类型是无效的。
如何从数据库中检索状态?
答案 0 :(得分:1)
使用此选项将Enum转换为字符串
cv.put(STATUS, dto.getStatus().name());
这将字符串转换回枚举
dto.setStatus(Enum.valueOf(DutyState.class, c.getString(c.getColumnIndex(TIME_STATUS))));
答案 1 :(得分:0)
问题是在数据库中存储了枚举值的名称(DRIVING
,ONDUTY
,...),并尝试根据id
检索值
我的建议是稍微重构你的代码。
首先,考虑一下您是否真的需要id
的{{1}}属性。每个DutyState
值都会自动生成enum
值。这些序数从零开始,因此它们与您为值分配的ordinal
不同。
如果您决定存储枚举的序号,则可以通过访问受保护的自动生成的静态成员id
轻松获取枚举值。请注意,如果更改枚举值的顺序,则序数值将会更改。因此,当我按顺序存储枚举时,我永远不会更改顺序,永远不会删除枚举值,我只会在最后添加枚举值。
其他选项是在数据库中存储枚举值的名称。这通常是最安全的选项(如果您不更改枚举值的名称)。此选项的效率稍低,因为它在数据库中占用更多空间。 @Ridcully已经展示了如何做到这一点。
作为第三种选择,您现在可以使用VALUES
。此选项安全有效。您只需要更改将存储的id
转换为枚举值的方式。
你可以这样做:
id
然后检索就是:
public enum DutyState {
DRIVING(0),
ONDUTY(1),
OFFDUTY(2),
SLEEPER(3),
NOSTATE(-1);
private final int state;
private DutyState(int s) {
this.state = s;
ID_TO_STATE.put(s, this);
}
private static Map<Int, DutyState> ID_TO_STATE = new HashMap<>();
public DutyState fromId(int s) {
return ID_TO_STATE.get(s);
}
}