可以在ListView Controller上编辑核心数据吗?

时间:2010-11-20 23:15:29

标签: iphone xcode core-data

我有一个Core Data应用程序设置了ListViewController,DetailViewController和EditingViewController,大多数编辑都在这里进行。在ListViewController上,我有一个复选框的图形,我可以通过选择

中的行来切换两个图像
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

是否可以从ListViewController编辑Core Data记录,以便我可以选择持久化?我无法弄清楚选择记录,编辑和保存值的语法 - 这将只是从true切换到false。

乔恩

感谢您的快速回复!答案后的其他信息1.您的假设是正确的。我正在使用CoreData Books示例对此应用程序进行建模。我没有使用按钮,而是使用两个图像来创建一个选中和未选中的复选框。我向我的实体添加了一个布尔“check”,重新创建了头文件,并将头文件添加到了我的ListViewController中。这是datamodel头文件的简化版本。

@interface Patient :  NSManagedObject  
{
}

@property (nonatomic, retain) NSString * location;
@property (nonatomic, retain) NSNumber * check;
@property (nonatomic, retain) NSString * lastName;

@end

这是我对你的代码的修改:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    NSManagedObject *entityObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
    if (![entityObject.check boolValue]) {
        entityObject.check = [NSNumber numberWithBool:YES];
        cell.imageView.image = [UIImage imageNamed:@"check.png"];
        }
    else {
        entityObject.check= [NSNumber numberWithBool:NO];
        cell.imageView.image = [UIImage imageNamed:@"uncheck.png"];
    }

然而,这给了我错误“请求成员'检查'的东西,而不是结构或联合”。我验证了new属性是一个布尔值,并且头文件被导入ListViewController。有什么想法吗?

最后,此代码是否消除了将entityObject.check保存到数据库的需要?再次感谢。

2 个答案:

答案 0 :(得分:1)

在我们提供更明智的建议之前,最好先了解一下您的应用的详细信息。无论如何,我会做出一些假设,看它是否有帮助...

首先,在Coredata中处理BOOL属性时,重要的是要记住它们实际上保存为NSNumbers,因此在需要测试它们的值并确保使用正确的方法时请记住这一点。

假设您的ListViewController中的数据正由CoreData填充,并且您的数据模型定义了一个实体“Entity”,其属性类型为BOOL,称为“收藏夹”,您可以尝试以下操作:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

       NSManagedObject *entityObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
       if (![entityObject.favourite boolValue]) {
            entityObject.favourite = [NSNumber numberWithBool:YES];
            [self.yourToggleButton setSelected:YES]; // this assumes your checkbox is a UIButton and you want its view to be updated to checked when your BOOL == YES
        }
        else {
            entityObject.favourite = [NSNumber numberWithBool:NO];
            [self.watchListButton setSelected:NO];
        }

以上假设您有一个fetchedResultsController,它也负责从您的CoreData数据库中获取数据。如果不是,我强烈建议您查看Apple的一个教程(CoreData Books和CoreData Recipes),了解它们的工作方式,因为它会让您的生活更轻松 - NSFetchedResultsController使您可以非常直接地保持数据在不同视图之间同步,这是您将不得不特别考虑的事项,因为您允许在不同的视图控制器中编辑不同的属性。

我希望这有帮助,但如果需要,可以随意提出任何其他问题。 干杯, ROG

答案 1 :(得分:0)

我提出了一个稍微不同的解决方案,但Rog的帖子肯定让我走上正轨。我在布尔语法方面遇到了一些麻烦,因此我将实体属性更改为字符串并改为使用“N”和“Y”。我还发现我需要保存值以使其持久化。我很感激帮助。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // Establish connections
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    Patient *patient = [self.fetchedResultsController objectAtIndexPath:indexPath];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    // Toggle images and check value with each row tap
    if ([patient.check isEqualToString: @"N"] == YES) {
        cell.imageView.image = [UIImage imageNamed:@"check.png"];
        patient.check = @"Y";
    }
    else {
        cell.imageView.image = [UIImage imageNamed:@"uncheck.png"];
        patient.check = @"N";
    }

    // Save check value
    NSError *error = nil;
    if (![context save:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}