保存/加载使用核心数据的游戏系统



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

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

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

我的 savegame 实体中有大约 200 个属性,例如 (NSNumber *)currentIncome、NSNumber *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似乎非常适合这一点。


解决:我刚刚重写了整个核心数据获取代码(20行减少到10行左右)。对没有谓词的实体执行 fetchrequest 显然会返回整个实体。如果我的(NSArray *)提取结果为 nil(数据库为空),我会在我的托管对象上下文中插入我的 savegame 实体的新实例。如果结果为非 nil,我只需执行一个(NSManagedObject *)saveGame = [fetchedResults lastObject],每个值都会加载正常。

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

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

总而言之,听起来你并没有从核心数据框架中获得太多价值。 另一种选择可能是查看iCloud Key-Value storage API,这听起来更接近您目前从核心数据中获得的内容。

最新更新