更新核心数据条目

时间:2012-08-21 14:11:03

标签: objective-c xcode core-data data-persistence

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

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条目并将其写回数据存储而不创建新条目,而是更新现有条目。

帮助/示例会如此有用并且非常感激。

谢谢,凯尔

1 个答案:

答案 0 :(得分:0)

好吧,从数据存储区更新条目很简单。获取,更新,保存。因为你似乎有一个处理。核心数据的真正问题是定义初始数据存储。核心数据的设计并没有引入数据库的概念,因此通常,在后端为您实现它之后(在应用程序调用它的第一次保存之后),它就不存在。

我所看到的开发人员通常要解决此问题,设置AppDelegate来实现快速而肮脏的黑客攻击:保存空数据库。然后他们注释掉这段代码;从磁盘检索文件,重命名,修改它,将其添加到项目的支持文件中。

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

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