2015-04-06 35 views
3

我有一个枚举类像如何在Android中的Sqlite数据库中插入枚举数据?

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。

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

回答

1

使用此枚举转换为字符串

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

,这串转换回枚举

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))); 
相关问题