Удаление определенного объекта из основных данных

У меня есть UITableView, содержащий объекты Core Data. Когда вы нажимаете на строку, вы попадаете на другой контроллер представления с возможностью, среди прочего, удалить изображение. Как удалить данные ядра конкретного объекта на основе выбранной строки. Итак, скажем, я бы выбрал изображение, а затем нажал кнопку удаления в представленном контроллере представления, он удалит только изображение, которое я выбрал.

РЕДАКТИРОВАТЬ добавлен код для удаления в 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"); 
}

person matthew    schedule 11.12.2013    source источник
comment
Покажите код, который вы используете для заполнения UITableView данными, и то, как вы передаете объект контроллеру подробного представления.   -  person Duncan Groenewald    schedule 11.12.2013


Ответы (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]];

        }
    }
}

Однако, если вы находитесь в каком-то подробном ViewController, то, предполагая, что вы передали manageObjectContext и manageObject этому подробному ViewController (я), вы просто использовали бы это. Еще раз предполагая, что вы используете fetchedResultsController в сочетании с UITableView, поэтому удаления правильно отражаются в UITableView.

   [self.managedObjectContext deleteObject:self.managedObject];

Вы можете передать их в detailViewController, создав свойства и установив такие свойства

@interface DetailedViewController: UIViewController

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

@end

и после создания подробного ViewController установите свойства, как показано ниже.

- (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];
}
person Duncan Groenewald    schedule 11.12.2013
comment
так что бы я установил для manageObject, будет ли это имя объекта или manageObjectContext? - person matthew; 11.12.2013
comment
Только что обновил ответ, чтобы показать, как вы можете получить объект, если вы используете fetchedResultsController. - person Duncan Groenewald; 11.12.2013
comment
Похоже, вам нужно немного почитать об интеграции Core Data, NSFetchedResultsController и UITableView :-) - person Duncan Groenewald; 11.12.2013
comment
Есть ли сообщение об ошибке, например if (![self.managedObjectContext save:&error]) { NSLog(@Unresolved error %@, %@, error, [error userInfo]); а для удаления? - person matthew; 11.12.2013
comment
Вам нужно сохранить, чтобы зафиксировать удаление, поэтому просто вызовите сохранение и проверьте наличие ошибок после удаления. Тот же код, что и в вашем комментарии. - person Duncan Groenewald; 11.12.2013
comment
Итак, после реализации всего этого и сохранения после удаления это не сохраняется. Это код, который я использую для удаления в DetailViewController - NSError *error = nil; [self.managedObjectContext deleteObject: self.managedObject]; [self.managedObjectContext сохранить: & ошибка]; if (![self.managedObjectContext save:&error]) { NSLog(@Неразрешенная ошибка %@, %@, error, [error userInfo]); прервать(); } else { NSLog(@Видео и фото удалены); } - person matthew; 12.12.2013
comment
поместите этот код в свой вопрос, чтобы он был читаемым, и опубликуйте сообщение об ошибке, которое вы получаете при сохранении. Также опубликуйте сведения о модели, потому что, если у вас возникнут проблемы с ссылочной целостностью в результате удаления, сохранение не удастся. - person Duncan Groenewald; 12.12.2013
comment
Не уверен, почему вы звоните save дважды, но удалите первый. Смотрите мое дополнение к вашему первоначальному вопросу - person Duncan Groenewald; 12.12.2013