1

我一直在尝试使用 Core Data 为游戏构建一个简单的加载/保存系统。

保存、加载和创建我的 UIManagedDocument 工作正常。在我的存档游戏实体中设置和加载属性值也可以正常工作。

问题是当我的应用退出时这些值会丢失,因为我不知道如何访问它们。

我的存档实体中有大约 200 个属性,例如 (NSNumber *)currentIncomeNSNumber *currentMoney, NSNumber *currentMonth等。看起来很简单,对吧?如果我将这些属性分组为具有关系的属性,我最终可能会得到大约 20 个属性。根据我从核心数据编程指南中收集到的内容,为了使用保存的 UIManagedDocument 中的值填充实体,我需要使用填充结果数组的谓词执行 fetchrequest。

这是我的第一个问题出现的地方:我是否需要为每个属性执行 fetchrequest?如果您只有几个属性或者如果您有“多”关系,这似乎很有用。就我而言,这似乎非常乏味。

我可能在这里遗漏了一些非常重要的东西,但我需要类似的东西,但我load my UIManagedDocument and automatically fill my NSManagedModel with the one that was saved in the document's context找不到。

这就是我的第二个问题出现的地方:CoreData 和 UIManagedDocument 甚至是正确的方法吗?200 个变量对于 NSUserDefaults 来说太多了——不过我可以想象使用 NSCoding。我肯定想在以后合并 iCloud 存档游戏共享,而 UIManagedDocument 和 CoreData 似乎非常适合这一点。


已解决:我刚刚重写了整个 Core Data 获取代码(20 行到 10 行左右)。对没有谓词的实体执行 fetchrequest 显然会返回整个实体。如果我的(NSArray *)fetchedResults 出现 nil(数据库为空),我将我的 savegame 实体的一个新实例插入到我的 managedobjectcontext 中。如果它出现非零,我只做 a(NSManagedObject *)saveGame = [fetchedResults lastObject]并且每个值都可以正常加载。

4

1 回答 1

0

从数据库的角度来看,这听起来像是一个数据库,其中包含一个saveGame包含 200 列currentMoney, currentMonth等的表。然后,您的数据库中有一行表示当前游戏状态。

NSFetchRequest相当于数据库SELECT语句,并且由于您只有一行,因此您实际上并不需要任何谓词WHERE子句等,只需从此表中获取所有内容,这就是您仅指定实体的获取请求正在执行的操作SELECT * FROM saveGame

所以总而言之,这听起来不像你从这里的核心数据框架中获得了太多价值。另一种选择可能是查看iCloud Key-Value storage API,这听起来更接近您当前从 core-data 获得的内容。

于 2012-07-06T12:45:17.750 回答