我一直在尝试使用 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]
并且每个值都可以正常加载。