我一直在尝试使用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]
并且每个值都可以正常加载。
答案 0 :(得分:0)
从数据库的角度来看,这里听起来就像是一个包含单个表saveGame
的数据库,其中包含200列currentMoney, currentMonth
等等。然后,您的数据库中有一行代表当前游戏州。
NSFetchRequest
相当于数据库SELECT
语句,因为你只有一行,你真的不需要任何谓词WHERE
子句等等,只需从中获取所有内容table,这是您的获取请求,它仅指定实体正在执行SELECT * FROM saveGame
。
总而言之,听起来你并没有从核心数据框架中获得更多价值。另一种选择可能是调查iCloud Key-Value storage API
,这听起来更接近您目前从核心数据中获得的内容。