【问题标题】:Save/Load system for game using CoreData使用 CoreData 保存/加载游戏的系统
【发布时间】:2012-07-06 06:16:45
【问题描述】:

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

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

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

我的存档游戏实体中有大约 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 似乎非常适合这一点。


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

【问题讨论】:

    标签: core-data nsmanagedobject uimanageddocument


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-07-17
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      相关资源
      最近更新 更多