[英]How do I change a value for a key at a specific index?
我一直试图找出如何在特定索引处更改键值的方法。 例如,如果我有以下数据,
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的值,该怎么办? 先感谢您!
这可能是一种更快的方法:
- (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执行此操作吗? 如果是这样,请参阅以下指南(未经复制,如果复制/粘贴,可能无法正常使用。仅用作示例):
- (void)newSlideNumber:(NSInteger)slideNumber forIndex:(NSInteger)index withTitle:(NSString *)title {
NSError *error = NULL;
// Delete the objects first, then recreate them:
[self deleteObjectsForEntityNamewithPred:@"MyEntityName" withPredicate:[NSPredicate predicateWithFormat:@"Index == %d", index]]; // This method is the one defined below
// Get the managed object from your context:
NSManagedObject *managedObjectStore = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntityName" inManagedObjectContext:self.managedObjectContext];
// Set the new values:
[managedObjectStore setValue:[NSNumber numberWithInteger:index] forKey:@"Index"];
[managedObjectStore setValue:[NSNumber numberWithInteger:slideNumber] forKey:@"slideNumber"];
[managedObjectStore setValue:title forKey:@"Title"];
// Save the context
[self.managedObjectContext save:&error];
if (error) {
NSLog(@"%@", [error description]);
}
}
- (void)deleteObjectsForEntityNamewithPred:(NSString *)entityName withPredicate:(NSPredicate *)pred {
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setPredicate:pred];
NSError *error = NULL;
NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];
[request release];
if (error) {
NSLog(@"%@", [error description]);
}
for (NSManagedObject *managedObject in results) {
[self.managedObjectContext deleteObject:managedObject];
}
}
一些参考文件:
NSPersistentStoreCoordinator类参考
假设您的核心数据实体具有三个属性:索引,幻灯片编号,标题
您可以使用以下代码检索正确的实体(如果您想像一个数据库,则建议在该表中作为行的实例):
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(键值编码)。 您可以通过子类化NSManagedObjects
来避免使用KVC,但这是不必要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.