更新 didSelectRowAtIndexPath 上的核心数据

Posted

技术标签:

【中文标题】更新 didSelectRowAtIndexPath 上的核心数据【英文标题】:Update Core Data on didSelectRowAtIndexPath 【发布时间】:2011-08-23 21:27:43 【问题描述】:

好吧,我已经在这几天了,似乎无法弄清楚我做错了什么。

我想要的是在选择一行时更新核心数据。我把它记下来了,但是我希望刷新表格视图以显示更改。那就是我遇到问题的地方。我跑:

    [NSFetchedResultsController deleteCacheWithName:@"Root"];
    fetchedResultsController = nil;
    NSError *error = nil;
    if(![[self fetchedResultsController] performFetch:&error])

    
    [[self tabVe] reloadData];

更新数据后,tableview 没有更新。我会改变观点并回来,但它是......卡住了。我仍然可以滚动并选择更多行,但表格永远不会刷新。我有一个分段控制器,它可以很好地按照我想要的方式更改数据,但是我说表格卡住的原因是因为在我选择一行后,分段控制器不会像它那样更改表格的内容会在选择一行之前。

我不是在编辑模式下这样做,我只是希望它在被选中时更新一个值。这是我的代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return [[self.fetchedResultsController sections] count];


-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo name];


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];



    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    
        [self.tabVe deselectRowAtIndexPath:indexPath animated:YES];
        if(cyc == 1)
            UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
            if(cell.accessoryType == UITableViewCellAccessoryCheckmark)
                cell.accessoryType = UITableViewCellAccessoryNone;
            else 
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
                Items *anItem = [self.fetchedResultsController objectAtIndexPath:indexPath];
                anItem.need = @"0";
                NSError *error = nil;
                if(![managedObjectContext save:&error])

                
                [NSFetchedResultsController deleteCacheWithName:@"Root"];
                fetchedResultsController = nil;
                NSError *error = nil;
                if(![[self fetchedResultsController] performFetch:&error])

                
                [[self tabVe] reloadData];
            
        
    

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath

    NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = [[managedObject valueForKey:@"name"] description];
    cell.detailTextLabel.text = [[managedObject valueForKey:@"notes"] description];
    if([[managedObject valueForKey:@"need"] description] == @"0")
        cell.accessoryType = UITableViewCellAccessoryNone;
    else if([[managedObject valueForKey:@"need"] description] == @"1")
        cell.accessoryType = UITableViewCellAccessoryNone;
    

我希望有人可以帮助我解决这个问题。 cyc 是一个显示分段控制器当前位置的 NSInteger,我目前只在 cyc 等于 1 时更新项目。

编辑:

一切顺利,直到

if(![managedObjectContext save:&error])


正在运行。在那之后,桌子似乎卡住了。

【问题讨论】:

【参考方案1】:

只是猜测,但想到了两件事:

    根据我的经验,尝试减少didSelectRowAtIndexPath: 中的代码,只需将fetchedResultsController 设置为nil 并让延迟加载处理获取即可。另一个想法是根本不使用任何缓存。这值得一试,如果它不影响性能,当然是合理的。

    我注意到您将两个字符串与== 进行比较。我认为您应该使用isEqualToString: 方法进行此比较。另外,我不确定为什么除了字符串之外还需要description 方法-NSStringdescription 是完全相同的字符串。也试着简化一下。

此外,从您的代码中不清楚变量cyc 是什么以及它来自何处。您可能想要选择更易于人类理解的变量名称。

【讨论】:

感谢您的建议。不幸的是,将fetchedResultsController 设置为nil 并且不使用缓存并没有使表正常工作。另外,我本来打算用isEqualToString,但完全忘记了,还是习惯了,所以谢谢你提醒我。不知道为什么我使用description,我只是这样做。无论如何,感谢您的帮助/建议,但我仍然遇到同样的问题。 您是否将cacheName:nil 放入您的fetchedResultsControllerinit 方法中? 是的,我将cacheName:nil 放入我的fetchedResultsControllerinit 方法中。 我自己制定了解决方法。根本不是一个合适的,但它适合我的需要。我现在混合使用 sqlite3 和核心数据。我会将您的答案标记为已接受的答案,因为它帮助了我:) 谢谢。出了什么问题?

以上是关于更新 didSelectRowAtIndexPath 上的核心数据的主要内容,如果未能解决你的问题,请参考以下文章

版本更新

ABP规则怎么自动更新

更新父状态时更新子组件

在哪看到手机历史更新日志

更新查询更新所有记录 - 只希望选择记录更新

Thinkphp怎么批量更新数据