0

我正在使用核心数据来保存游戏的分数,并且在得分被击败时需要帮助更新条目。这就是我所在的地方。我在应用程序第一次启动时写入数据,如下所示:

LevelData *levelOne = [NSEntityDescription insertNewObjectForEntityForName:@"LevelData" inManagedObjectContext:context];
    levelOne.levelNum = @"1";
    levelOne.topScore = @"0";
    levelOne.isPassed = @"No";

    if (![context save:&error]) {
        NSLog(@"coudlnt save: %@", [error localizedDescription]);
    }

然后我在关卡末尾读出数据,如下所示:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"levelNum == 1"];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"LevelData" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
for (LevelData *info in fetchedObjects) {
    NSLog(@"Is Passed: %@", info.levelNum);
    NSLog(@"Top Score: %@", info.topScore);
    NSLog(@"Is Passed: %@", info.isPassed);
}

我一直在做的是更新 topScore 条目并将其写回数据存储而不创建新条目,而是更新现有条目。

帮助/示例会非常有帮助,非常感谢。

谢谢,凯尔

4

1 回答 1

0

好吧,从数据存储中更新条目很容易。获取、更新、保存。正如你似乎有把握。核心数据的真正问题是定义初始数据存储。核心数据的设计并没有引入数据库的概念,因此通常情况下,直到后端为您实现它(在您的应用程序调用它的第一次保存之后)才存在。

我看到开发人员通常会做些什么来解决这个问题,即设置 AppDelegate 来实现一个快速而肮脏的 hack:保存一个空的数据库。然后他们注释掉这段代码;从磁盘检索文件,重命名,修改,添加到项目的支持文件中。

现在,重新访问 AppDelegate,他们在应用程序启动时测试客户端机器上数据存储的存在。如果不存在,他们知道从他们的支持文件中注入默认数据存储。基本上将其复制到适当的路径并适当地重命名它。

这对于版本控制变得过于复杂。另一种方法是将默认值的 plist 写入主包,并在第一次启动时将其导入,并将一个密钥存储在用户默认值中,让我知道这是否有必要。它需要更多的样板代码,但它是一种很好的设置方式。您可以对版本控制数据进行编码以支持升级合并更容易。如果您能够很好地处理核心数据,那么操作 XML 应该不会更困难。

于 2012-08-21T15:06:32.633 回答