繁体   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