簡體   English   中英

當存儲的數據和數據格式在將來的版本中可能發生變化時,存儲應用程序數據的最佳方法?

[英]Best way to store application data when data stored and data format could change in future versions?

我正在制作一個Android Java應用程序游戲(盡管這個問題確實適用於所有語言),希望很快發布第一個版本。 我很擔心如何在游戲中保存數據。 我的問題是,如果在以后的更新中,我決定存儲更多數據或以其他方式存儲相同數據,則需要注意,不要為升級用戶丟失或破壞數據(即,我希望用戶能夠能夠使用新版本中舊版本創建的數據,例如以前的高分)。

例如,假設我想在版本1中保存高分,並且使用類似以下的類:

class Score { String name; int score; }

然后,將分數存儲在ArrayList中,然后,為了保存/加載分數,我將ArrayList對象序列化。

在1.1版中,也許我決定要與每個樂譜一起存儲日期。 然后,我可以更新“分數”對象以包括日期字段,如果舊對象不包括日期,則可以使用默認值作為日期。

在1.2版中,也許我決定將分數存儲在TreeSet中,而在1.3版中,我也想在線加載/存儲分數。

無論如何,我的意思是,在這里是否有一些使我的生活變得輕松的一般技巧? 我特別關注上述情況,一個人從1.1版升級到1.2,一個人從1.0版升級到1.2。 測試所有方案中的數據損壞聽起來很頭疼。

難道真的只是在思考很難選擇明智且可擴展的東西嗎?

我認為將String-> Object中的HashMap用作通用存儲對象可能很容易,例如storage.put(“ HighScoreName1”,“ Bob”); storage.put(“ HighScorePoints1”,15);。 與我使用自定義類相比,獲取信息稍微有些混亂,但是添加額外的字段似乎很容易,而無需做很多工作。 遍歷以這種方式存儲的列表並不是很好。

如果您使用的是SQLiteOpenHelper,請查看onUpgrade方法。

在需要升級數據庫時調用。 實現應使用此方法刪除表,添加表或執行其他任何升級到新架構版本所需的操作。

在編寫序列化內容之前,請在輸出流中寫入版本號。 我還建議在流的前面編寫一個魔術字符串序列(只是您可以說的是您的內容-可能是5或6個字符)。 因此,您將寫MAGIC,然后您將寫下版本號。 然后,您將編寫序列化的內容。

從磁盤讀取非常簡單-讀取並確認魔術。 閱讀版本。 反序列化,然后將反序列化的內容傳遞給基於魔術的處理程序。

不過,請注意以下幾點:如果可能,請使序列化流中使用的類保持簡單(字符串,整數等)。 如果您使用自己的類,則必須非常小心,以免您不必以改變包或類名的方式進行重構。

從長遠來看,很誘人的只是使用序列化將您的業務對象寫入存儲,這幾乎總是一個錯誤。 相反,我強烈建議開發一個Configuration對象。 您的應用程序通過Configuration對象初始化自身。 當需要保存時,應用程序將構造一個Configuration對象。 這樣一來,您就永遠不會更改Configuration類,因為它一經交付就可以使用。 只需創建一個新的子類即可。

通過將配置對象的讀取和寫入分開,您可以輕松地執行以下操作:

  1. 閱讀舊的配置
  2. 稍后使用舊配置初始化應用程序...
  3. 應用創建新配置
  4. 將新配置寫入文件

presto-即時文件格式更新。

顯然,這類事情要處理大型,復雜的數據圖非常困難(無論如何,很多工作)-但這是您正在談論的Android,因此持久狀態可能並不那么復雜。

請注意,另存為XML甚至保存到SQL數據庫只是上述策略的另一種形式。

沒有確切的答案,但是您要查找的術語是版本控制。 最佳的序列化實現(和文件格式)可以使雙向運行(應用程序的舊版本可以讀取新版本的文件,反之亦然)。

暫無
暫無

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

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