簡體   English   中英

如何在Android的Sqlite數據庫中插入枚舉數據?

[英]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))));

問題是在數據庫中存儲枚舉值的名稱( 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)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM