我可以为一个iPhone应用程序拥有多个Core数据处理程序吗?

时间:2010-11-16 07:36:00

标签: objective-c sqlite core-data

我想为一个iPhone应用程序构建一个带有2个核心数据处理程序的应用程序。

该应用程序将是一个预先填写信息的体育游戏。让我们称之为prefilledDB作为参考。这个prefilledDB将是只读的,我不希望用户添加/编辑/删除或更改此内容。

第二个db(“gameDB”)将具有相同的核心数据关系/模型/实体和结构。

当用户选择“新游戏”时,它将清空/清空gameDB并用prefilledDB内容填充它,“继续游戏”将使用prefilledDB,假设它不是空的。

但是,我不确定这是否是正确的方法。因此,我的问题是处理这种处理的最佳方法是什么。内置迁移系统是否比删除/重新创建数据库更好 - 或者只是使用SQLite作为prefilledDB,然后用其内容填充gameDB?

对此的任何帮助都会很棒。

1 个答案:

答案 0 :(得分:2)

prefilled持久存储必须是只读的,如果它在应用程序包中发布,因为应用程序包中的所有内容都是只读的。要在readwrite持久存储中使用数据,您需要将数据复制到应用程序包外部的持久存储中,例如在应用程序的文档目录中。

您有两种方法:

1)最简单:为每个游戏创建一个新的持久性商店。在这种情况下,您只需将prefilled持久性存储文件从app目录复制到文档目录,同时在此过程中将其重命名为当前游戏名称。然后,您将该文件作为gameDB打开,它将自动填充预先存在的数据。这个系统的缺点是你有大量的文件,每个游戏一个,并且它们之间的数据不容易共享。

2)最佳:您在同一个上下文中同时使用两个持久存储。设置起来比较复杂,但为您提供了更大的灵活性。诀窍是创建一个单一的抽象子实体,例如Opponent然后两个具体的子实体,除了名称之外,它们是完全相同的,例如PreOpponentGameOpponent。使用数据模型中的配置选项,将PreOpponent分配给prefilled持久性存储,将GameOpponent分配给gameDB持久性存储。在Opponent类中编写一些代码以将其自身克隆到新的GameOpponent实例。当新游戏开始时,将所有实例从prefilled克隆到'gameDB'。所有新克隆的GameOpponent实例将自动写入gameDB持久性存储。

后一种系统的优点是,您可以将所有活动数据放在一个readwrite持久性存储中,然后可以根据需要进行操作。例如。你可以检查以前的游戏,甚至克隆以前的游戏,为新游戏创造一个新的起点。

Marcus Zarrus在他的网站上有一些代码,展示了如何为托管对象设置自动克隆。