Iphone 如何在特定索引处更改键的值?

Iphone 如何在特定索引处更改键的值?,iphone,ios,core-data,Iphone,Ios,Core Data,我一直在试图找出如何在特定索引处更改键的值。例如,如果我有以下数据 Index | slideNumber | Title -------------------------------------------- 1 | 5 | test 1 2 | 2 | test 2 3 | 5 | test 3 4 | 7 | test 4 5 |

我一直在试图找出如何在特定索引处更改键的值。例如,如果我有以下数据

Index |  slideNumber  |  Title
--------------------------------------------
1     |      5        |  test 1
2     |      2        |  test 2
3     |      5        |  test 3
4     |      7        |  test 4
5     |      9        |  test 5
如果我想更改索引3处slideNumber的值,我将如何做?提前谢谢你

编辑(感谢@morningstar的建议): 这可能是一种更快的方法:

- (void)newSlideNumber:(NSInteger)slideNumber 
              forIndex:(NSInteger)index {
    NSError *error = NULL;
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"Slides" 
                                   inManagedObjectContext:self.managedObjectContext]];

    [request setPredicate:[NSPredicate predicateWithFormat:@"Index == %d", index]];
    NSArray *results = [self.managedObjectContext executeFetchRequest:request 
                                                                error:&error];

    [request release];
    if ([results count]) {
        [(NSManagedObject *)[results objectAtIndex:0] setValue:[NSNumber numberWithInteger:slideNumber] 
                                                        forKey:@"slideNumber"];
    } else if (error) {
        NSLog(@"%@", [error description]);
    } else {
        NSLog(@"predicateWithFormat (Index == %d) did not match any objects!", index);
    }
}

原 你在用CoreData做这件事吗?如果是这样,这里有一个指南(未经测试,可能不会像复制/粘贴时那样工作。仅用作示例):

一些参考文件:



假设核心数据实体有三个属性:索引、slideNumber和标题

您可以使用以下代码检索正确的实体(该表中某行的实例,如果您的想法与我推荐的数据库类似):

NSManagedObjectContext *moc = ...;
NSInteger myIndex = 3;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:moc]];
[request setPredicate:[NSPredicate predicateWithFormat:@"index == %i", myIndex]];

NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];
if (error && !results) {
  NSLog(@"Error %@\n%@", [error localizedDescription], [error userInfo]);
}
NSManagedObject *myEntity = [results lastObject];
现在我们有了实体,编辑一个值就是一个简单的KVC调用:

[myEntity setValue:[NSNumber numberWithInteger:5 forKey:@"slideNumber"];
从那里,您可能需要保存更改:

NSManagedObjectContext *moc = ...;
NSError *error = nil;
if (![moc save:&error]) {
  NSLog(@"Error %@\n%@", [error localizedDescription], [error userInfo]);
}
最好将核心数据视为对象图,而不是数据库中的表。数据库只是保存数据的一种手段


我还建议阅读KVC(键值编码)。如果你想避免使用KVC,你可以通过子类化你的
NSManagedObjects
来避免,但这是不必要的。

当你说“特定索引处的键值”时,你是如何在你的应用程序中存储这些索引、幻灯片和标题的?您正在使用NSDictionary、NSArray或其他结构吗?删除对象可能不是最好的方法。只需像在第二个函数中那样编写代码,而不是
[self.managedObjectContext deleteObject:managedObject]
,而是
[managedObject setValue:[NSNumber numberwhithint:slideNumber]forKey:@“slideNumber”]
。仅仅为了设置一个属性,不必删除和重新创建对象。如果存在与对象的关系,它也会变得更复杂,如果某个地方存在“弱”关系存储了对象的objectID以供以后引用,则情况会更复杂。谢谢大家,我是个新手,这正是我需要的,让它起作用了!我只需要在我想要修改的对象上使用一个谓词来归零,现在变得更有意义了,再次感谢!
NSManagedObjectContext *moc = ...;
NSError *error = nil;
if (![moc save:&error]) {
  NSLog(@"Error %@\n%@", [error localizedDescription], [error userInfo]);
}