繁体   English   中英

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

[英]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的值,该怎么办? 先感谢您!

编辑(感谢@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执行此操作吗? 如果是这样,请参阅以下指南(未经复制,如果复制/粘贴,可能无法正常使用。仅用作示例):

- (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类参考

NSManagedObjectModel类参考


假设您的核心数据实体具有三个属性:索引,幻灯片编号,标题

您可以使用以下代码检索正确的实体(如果您想像一个数据库,则建议在该表中作为行的实例):

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM