[英]How to Insert the Enum Data in the Sqlite Database in 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 for State
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中,它的返回類型是無效的。
如何從數據庫中檢索狀態?
使用它將Enum轉換為字符串
cv.put(STATUS, dto.getStatus().name());
這將字符串轉換回枚舉
dto.setStatus(Enum.valueOf(DutyState.class, c.getString(c.getColumnIndex(TIME_STATUS))));
問題是在數據庫中存儲枚舉值的名稱( DRIVING
, ONDUTY
,...),並嘗試根據id
檢索值。
我的建議是稍微重構你的代碼。
首先,考慮一下你是否真的需要DutyState
的id
屬性。 每個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)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.