我正在使用Google的Firebase。我將Java Enum作爲其中一個模型類的成員之一。將實例保存到Firebase數據庫時,會引發異常。什麼是最好的解決方法?什麼是使用Firebase保存Java Enums的最佳方式
回答
更多的研究之後。這是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);
}
}
}
找到了我的問題的部分答案,但仍在尋找解決方法。
如果你定義瞭如下所示的枚舉和模型類,那麼突然枚舉成功持久化爲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;
}
}
很高興聽到您找到解決方案。你能添加一些代碼來顯示你在你的代碼中如何使用這個類嗎?如果您可以指定您正在使用的Firebase版本,那也是非常好的,因爲自從最新版本(Google Play Services 9.0)以來,不再包含'JsonProperty'註釋。 –
我使用的是Firebase 9.0.0以及谷歌播放服務9.0.0。我還沒有很多使用Firebase的經驗,但添加了@Jsonxxx註釋纔有效。沒有註釋和額外的代碼,save會引發異常。我可能會在未來幾天更多地瞭解「爲什麼」這個工作,我會更新。 –
在9.0.0版本中,我們還沒有替換'@JsonProperty()'。但是我們會在即將發佈的版本中添加一個,以便您可以從您的應用中刪除Jackson依賴項並縮小APK大小。 –
- 1. 什麼是使用Java中的ENUMS驗證值組合的最佳方法?
- 2. 使用Java,將圖像保存到文件的最佳方式是什麼?
- 3. jQuery mobile - 保存用戶輸入的最佳方式是什麼?
- 4. 什麼是保存用戶名和高分的最佳方式
- 5. 分析Feed時,本地保存的最佳方式是什麼?
- 6. 將數據保存到文件的最佳方式是什麼?
- 7. 保存和加載變量的最佳方式是什麼?
- 8. 在ASP.NET中保存UICulture的最佳方式是什麼?
- 9. 在MySQL中保存KML的最佳方式是什麼?
- 10. 保存排序到sql的最佳方式是什麼?
- 11. 保存遊戲得分的最佳方式是什麼?
- 12. 保存RichText(WYSIWYG輸出)的最佳方式是什麼?
- 13. 什麼是保存/加載Windows窗體的最佳方式ToolStripMenuItem
- 14. 什麼是保存遊戲狀態的最佳方式?
- 15. 什麼是遠程保存圖片的最佳方式?
- 16. 在sql server中保存視頻的最佳方式是什麼?
- 17. 保存表格中表格的最佳方式是什麼?
- 18. 在android中保存數據的最佳方式是什麼?
- 19. 什麼是保存ArrayList內容的最佳方式?
- 20. 什麼是使用java swing的日期的最佳方式
- 21. 保存在java/android中使用的python字典的最佳方法是什麼?
- 22. 在Firebase中存儲信息應用的數據的最佳方式是什麼?
- 23. 使用Java傳輸文件的最佳方式是什麼?
- 24. 什麼是使用java提取zip文件的最佳方式
- 25. 使用Java構建HTML文件的最佳方式是什麼?
- 26. 使用Hibernate存儲數組的最佳方式是什麼?
- 27. 存儲數據以使用jQuery的最佳方式是什麼?
- 28. 使用MySQL存儲URL值的最佳方式是什麼?
- 29. 保存使用Python從Facebook收集的評論的最佳方式是什麼?
- 30. swift什麼是從firebase檢索snap節點的最佳方式
不知火力地堡明確,但一般使用基於文本的數據庫時,首選的方法(如JSON /蒙戈)是使用枚舉名稱。 – chrylis