2016-05-21 101 views
0

我正在使用Google的Firebase。我將Java Enum作爲其中一個模型類的成員之一。將實例保存到Firebase數據庫時,會引發異常。什麼是最好的解決方法?什麼是使用Firebase保存Java Enums的最佳方式

+0

不知火力地堡明確,但一般使用基於文本的數據庫時,首選的方法(如JSON /蒙戈)是使用枚舉名稱。 – chrylis

回答

1

更多的研究之後。這是Firebase 3.0.0的解決方法。顯然以前的版本Firebase已經被淘汰的傑克遜更靈活的支持。這裏有一個招聘類枚舉,工程(與哈克代碼)

public class Job { 
    public enum JobLifecycle { 
    New, inTransit, inStorage, delivered, signedOff; 
    } 

    ...// other fields omitted 
    JobLifecycle lifecycle; 

    public Job(){ 
    } 


    @Exclude 
    public JobLifecycle getLifecycleAsEnum(){ 
    return lifecycle; 
    } 

    // these methods are just a Firebase 9.0.0 hack to handle the enum 
    public String getLifecycle(){ 
    if (lifecycle == null){ 
     return null; 
    } else { 
     return lifecycle.name(); 
    } 
    } 

    public void setLifecycle(String lifecycleString){ 
    if (lifecycleString == null){ 
     lifecycle = null; 
    } else { 
     this.lifecycle = JobLifecycle.valueOf(lifecycleString); 
    } 
    } 
} 
1

找到了我的問題的部分答案,但仍在尋找解決方法。

如果你定義瞭如下所示的枚舉和模型類,那麼突然枚舉成功持久化爲2節點結構,其中typename作爲父節點,而enum的字符串值作爲子節點。但是當我嘗試讀取諸如Job j = xxx.getValue(Job.class)這樣的代碼的節點時,將拋出異常:com.google.firebase.database.DatabaseException: Class com.ranchosoftware.ranchomovingandstorage.model.JobLifecycle is missing a constructor.根據Frank的評論,我認爲現在Firebase沒有解決方案。我不確定什麼是最好的解決方法。

public enum JobLifecycle { 
    New, inTransit, inStorage, delivered, signedOff; 

    JobLifecycle(){} 

    String value; 

    @JsonValue 
    public String getValue(){ 
    return this.name(); 
    } 

    @JsonCreator 
    public static JobLifecycle fromValue(String jobLifecycleString){ 
    for (JobLifecycle l : JobLifecycle.values()){ 
     if (l.name().equals(jobLifecycleString)){ 
     return l; 
     } 
    } 
    throw new IllegalArgumentException("Invalid jobLifecycle code: " + jobLifecycleString); 
    } 
} 

使用像這樣的模型類:

public class Job { 
    ... // other fields omitted 
    JobLifecycle lifecycle; 

    public Job(){ 
    } 

    ... // other content omitted 

    @JsonProperty("lifecycle") 
    public JobLifecycle getLifecycle(){ 
    return lifecycle; 
    } 
} 
+0

很高興聽到您找到解決方案。你能添加一些代碼來顯示你在你的代碼中如何使用這個類嗎?如果您可以指定您正在使用的Firebase版本,那也是非常好的,因爲自從最新版本(Google Play Services 9.0)以來,不再包含'JsonProperty'註釋。 –

+0

我使用的是Firebase 9.0.0以及谷歌播放服務9.0.0。我還沒有很多使用Firebase的經驗,但添加了@Jsonxxx註釋纔有效。沒有註釋和額外的代碼,save會引發異常。我可能會在未來幾天更多地瞭解「爲什麼」這個工作,我會更新。 –

+0

在9.0.0版本中,我們還沒有替換'@JsonProperty()'。但是我們會在即將發佈的版本中添加一個,以便您可以從您的應用中刪除Jackson依賴項並縮小APK大小。 –

相關問題