как удалить не зафиксированные объекты из контекста? - PullRequest
1 голос
/ 23 февраля 2011

Я использую основные данные и NSFetchedResultsController в приложении для подачи UIViewTable с объектами Car. У меня есть кнопка, которая во вкладке переводит приложение в другое представление, когда пользователь может добавить новый автомобиль. У меня проблема в том, что даже если пользователь не создает автомобиль во втором представлении, он добавляется в таблицу. Если я перезапущу приложение, Автомобиль не будет добавлен в БД.

Это связано с тем, что я создаю экземпляр Car во втором представлении, в методе viewDidLoad, используя что-то вроде этого:

    car = [NSEntityDescription insertNewObjectForEntityForName:@"Car" 
                                  inManagedObjectContext:context];

Это добавляется, даже если я не сохраняю контекст.

Я пытался удалить объект, когда второе представление закрывается, используя это:

[context deleteObject:car];

Это частично работает. Автомобиль не добавляется в таблицу на первой странице, но выглядит так, будто индексы источника данных изменены. Если я прокручиваю весь путь вниз, я получаю эту ошибку:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[_PFBatchFaultingArray objectAtIndex:]: index (9) beyond bounds (9)'

Будут оценены любые идеи.

Ответы [ 2 ]

1 голос
/ 23 февраля 2011

Попробуйте создать свой автомобильный объект, передав контекст nil:

car = [NSEntityDescription insertNewObjectForEntityForName:@"Car" 
                              inManagedObjectContext:nil];

Оттуда, если пользователь решит сохранить его, вы можете переместить объект в основной контекст.

Другая альтернатива состоит в том, чтобы иметь отдельный MOC для этого представления (что добавляет ненужные сложности), а затем снова перемещать объект между контекстами, если / когда требуется.

Приветствия

1011 * Рог *

PS: если вам интересно, можете ли вы передать nil в качестве управляемогоObjectContext, это прямо из документации Apple по NSManagedObject:

... Если контекст не ноль, этот метод вызывает [context insertObject: self] (который вызывает awakeFromInsert быть прибег) ...

Подробнее здесь

[EDIT]

В дополнение к этому, я просто наткнулся на кое-что интересное, просматривая документацию NSFetchRequest, и подумал, что вы можете попробовать (я сам не пробовал). Похоже, что вы можете указать fetchRequest, включать ли ожидающие изменения (т.е. не сохраненные) или нет при извлечении объектов:

- (void)setIncludesPendingChanges:(BOOL)yesNo

К вашему сведению значение по умолчанию - ДА - более подробная информация здесь

0 голосов
/ 23 февраля 2011

Во-первых, попробуйте отложить вставку нового объекта, когда пользователь фиксирует изменение.

Только если это не подходит:

Когда контекст изменился, NSFetchedResultsController автоматически информируется об изменении своих данных, передаваемых в контроллер табличного представления.Однако само табличное представление не изменено, поэтому вам необходимо обновить табличное представление самостоятельно.

Именно поэтому NSFetchedResultsController имеет объект делегата (соответствующий протоколу NSFetchedResultsControllerDelegate), который отвечает заобновите табличное представление.

Например, в примере проекта CoreDataBooks вы увидите методы делегирования этого протокола в классе RootViewController.Наиболее связанный метод делегата - controller: didChangeObject: atIndexPath: forChangeType: newIndexPath:.Возможно, вы захотите сделать что-то вроде следующего:

if (changeType == NSFetchedResultsChangeDelete) {
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...