Objective c 更新核心数据条目

Objective c 更新核心数据条目,objective-c,xcode,core-data,data-persistence,Objective C,Xcode,Core Data,Data Persistence,我正在使用核心数据为游戏保存分数,需要帮助在分数被击败时更新条目。这就是我所处的位置。我在应用程序第一次启动时写入数据,如下所示: LevelData *levelOne = [NSEntityDescription insertNewObjectForEntityForName:@"LevelData" inManagedObjectContext:context]; levelOne.levelNum = @"1"; levelOne.topScore = @"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);
}
然后,我读出了级别末尾的数据,如下所示:

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

帮助/榜样将非常有用,非常感谢


谢谢,Kyle,从数据存储更新条目很容易。获取、更新、保存。因为你似乎有控制权。核心数据的真正问题是定义初始数据存储。核心数据的设计没有引入数据库的概念,因此通常,在后端为您实现它之前(在您的应用程序调用其第一次保存之后),数据库是不存在的

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

现在,再次访问AppDelegate,他们在应用程序上测试客户机上是否存在数据存储。如果不存在,他们知道从支持文件中插入默认数据存储。。基本上是将其复制到适当的路径,并对其进行适当的重命名


这在版本控制中变得过于复杂。另一种方法是将默认值列表写入主捆绑包,并在第一次启动时导入,然后将一个键存储在user defaults中,以告知是否有必要。它需要更多的样板代码,但这是一种很好的设置方法。您还可以对版本控制数据进行编码,以更轻松地支持升级合并。如果您能够很好地处理核心数据,那么处理XML应该不会太困难。

感谢您的回复,我已经完成了后端设置,并按照自己的意愿工作。问题是,每当我尝试保存时,似乎都会向数据存储添加一个新条目,从而导致levelNum 1出现多个条目。因此,如果你能根据我已经使用的代码向我展示任何要更新和保存的代码,那将是令人惊讶的。