如何在Android的Sqlite数据库中插入枚举数据?

时间:2015-04-06 10:25:25

标签: java android

我有一个类似

的枚举类
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中,它的返回类型是无效的。

如何从数据库中检索状态?

2 个答案:

答案 0 :(得分:1)

使用此选项将Enum转换为字符串

cv.put(STATUS, dto.getStatus().name());

这将字符串转换回枚举

dto.setStatus(Enum.valueOf(DutyState.class, c.getString(c.getColumnIndex(TIME_STATUS))));

答案 1 :(得分:0)

问题是在数据库中存储了枚举值的名称(DRIVINGONDUTY,...),并尝试根据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);
   }
}