【问题标题】:Deleting a specific object from core data从核心数据中删除特定对象
【发布时间】:2013-12-12 14:09:59
【问题描述】:

我有一个包含核心数据对象的 UITableView。当您单击一行时,您将被带到另一个视图控制器,其中包含删除图像等选项。我将如何根据我选择的行删除特定对象的核心数据。所以说我会选择一个图像,然后单击呈现的视图控制器中的删除按钮,它会删除我只选择的图像。

EDIT为DetailedViewController中的删除添加代码

NSError *error = nil; 
[self.managedObjectContext deleteObject:self.managedObject]; 

// REMOVE THIS LINE NO NEED TO CALL SAVE TWICE
//[self.managedObjectContext save:&error]; 

if (![self.managedObjectContext save:&error]) { 
NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
abort(); 
} else { 
NSLog(@"Video and Photo Deleted"); 
}

【问题讨论】:

  • 显示您使用数据填充 UITableView 的代码以及如何将对象传递给详细视图控制器。

标签: ios core-data delete-row


【解决方案1】:

如果您在 UITableView 中删除并假设您使用的是 fetchedResultsController,通常您会使用类似的内容。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableView == self.tableView) {
        if (editingStyle == UITableViewCellEditingStyleDelete) {
           NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
           [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

        }
    }
}

但是,如果您在某个 detailViewController 中,那么假设您将 managedObjectContext 和 managedObject 传递给了这个 detailViewController (self),您就可以使用它。再次假设您将 fetchedResultsController 与 UITableView 结合使用,因此删除会正确反映在 UITableView 中。

   [self.managedObjectContext deleteObject:self.managedObject];

您可以通过创建属性并像这样设置属性来将这些传递给详细视图控制器

@interface DetailedViewController: UIViewController

@property (strong, nonatomic) NSManagedObject *detailItem;
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

@end

在创建 detailViewController 之后,设置如下所示的属性

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];

    // Code to create detailed view and set properties
     DetailedViewController *detailedViewController = [DetailedViewController alloc] ...;
     detailedViewController.managedObjectContext = self.managedObjectContext;
     detailedViewController.managedObject = object;

     [self.navigationController pushViewController:detailViewController animated:YES];
}

【讨论】:

  • 那么我将 managedObject 设置为什么,这是实体的名称还是 managedObjectContext?
  • 刚刚更新了答案以显示假设您使用的是 fetchedResultsController 将如何检索对象。
  • 听起来你需要阅读一下核心数据、NSFetchedResultsController 和 UITableView 集成 :-)
  • 是否存在类似“if (![self.managedObjectContext save:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]);" 之类的错误消息但要删除?
  • 您需要保存才能提交删除,因此只需调用保存并在删除后检查错误。与您评论中的代码相同。
猜你喜欢
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2011-09-25
  • 1970-01-01
相关资源
最近更新 更多