[英]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类,因为它一经交付就可以使用。 只需创建一个新的子类即可。
通过将配置对象的读取和写入分开,您可以轻松地执行以下操作:
presto-即时文件格式更新。
显然,这类事情要处理大型,复杂的数据图非常困难(无论如何,很多工作)-但这是您正在谈论的Android,因此持久状态可能并不那么复杂。
请注意,另存为XML甚至保存到SQL数据库只是上述策略的另一种形式。
没有确切的答案,但是您要查找的术语是版本控制。 最佳的序列化实现(和文件格式)可以使双向运行(应用程序的旧版本可以读取新版本的文件,反之亦然)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.