我想为一个iPhone应用程序构建一个带有2个核心数据处理程序的应用程序。
该应用程序将是一个预先填写信息的体育游戏。让我们称之为prefilledDB作为参考。这个prefilledDB将是只读的,我不希望用户添加/编辑/删除或更改此内容。
第二个db(“gameDB”)将具有相同的核心数据关系/模型/实体和结构。
当用户选择“新游戏”时,它将清空/清空gameDB并用prefilledDB内容填充它,“继续游戏”将使用prefilledDB,假设它不是空的。
但是,我不确定这是否是正确的方法。因此,我的问题是处理这种处理的最佳方法是什么。内置迁移系统是否比删除/重新创建数据库更好 - 或者只是使用SQLite作为prefilledDB,然后用其内容填充gameDB?
对此的任何帮助都会很棒。
答案 0 :(得分:2)
prefilled
持久存储必须是只读的,如果它在应用程序包中发布,因为应用程序包中的所有内容都是只读的。要在readwrite持久存储中使用数据,您需要将数据复制到应用程序包外部的持久存储中,例如在应用程序的文档目录中。
您有两种方法:
1)最简单:为每个游戏创建一个新的持久性商店。在这种情况下,您只需将prefilled
持久性存储文件从app目录复制到文档目录,同时在此过程中将其重命名为当前游戏名称。然后,您将该文件作为gameDB
打开,它将自动填充预先存在的数据。这个系统的缺点是你有大量的文件,每个游戏一个,并且它们之间的数据不容易共享。
2)最佳:您在同一个上下文中同时使用两个持久存储。设置起来比较复杂,但为您提供了更大的灵活性。诀窍是创建一个单一的抽象子实体,例如Opponent
然后两个具体的子实体,除了名称之外,它们是完全相同的,例如PreOpponent
和GameOpponent
。使用数据模型中的配置选项,将PreOpponent
分配给prefilled
持久性存储,将GameOpponent
分配给gameDB
持久性存储。在Opponent
类中编写一些代码以将其自身克隆到新的GameOpponent
实例。当新游戏开始时,将所有实例从prefilled
克隆到'gameDB'。所有新克隆的GameOpponent
实例将自动写入gameDB
持久性存储。
后一种系统的优点是,您可以将所有活动数据放在一个readwrite持久性存储中,然后可以根据需要进行操作。例如。你可以检查以前的游戏,甚至克隆以前的游戏,为新游戏创造一个新的起点。
Marcus Zarrus在他的网站上有一些代码,展示了如何为托管对象设置自动克隆。