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]);
}