使用Core Data保存/加载游戏系统

时间:2012-07-05 19:25:15

标签: core-data nsmanagedobject uimanageddocument

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

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

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

我的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是否是正确的方法? NSUserDefaults的200个变量太多了 - 我可以想象使用NSCoding。我肯定希望稍后合并iCloud存档游戏,而UIManagedDocument和CoreData似乎对此非常有用。


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

1 个答案:

答案 0 :(得分:0)

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

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

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