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

5

我有一个类似于枚举的类

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中,我创建了一个状态为int的数据类型。

在dto中,它的返回类型是void。

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

2个回答

1
使用这个将枚举转换为字符串
cv.put(STATUS, dto.getStatus().name());

将字符串转换为枚举类型的代码:

and this to convert string back to enum

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

0
问题在于你在数据库中存储了枚举值的名称(例如DRIVINGONDUTY等),并尝试基于id检索这些值。
我的建议是稍微重构一下你的代码。
首先,请考虑您是否真的需要DutyStateid属性。每个enum值都有一个自动生成的ordinal值。这些序数从零开始,因此它们与您分配给值的id不同。
如果您决定存储枚举的序数,您可以通过访问受保护的自动生成静态成员VALUES轻松获取枚举值。请注意,如果更改枚举值的顺序,序数值将发生变化。因此,当我按其序数存储枚举时,我从不更改顺序,从不删除枚举值,并且仅将枚举值添加到末尾。

另一个选择是在数据库中存储枚举值的名称。这通常是最安全的选择(如果您不更改枚举值的名称)。这个选项效率略低,因为它在数据库中使用了更多的空间。@Ridcully已经展示了如何实现。

作为第三个选择,您可以像现在一样使用 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);
   }
}

那么检索将会很简单:

dto.setStatus(DutyState.fromId(c.getInt(TIME_STATUS)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接