2015-04-06 39 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))); 
相關問題