Как отсоединить управляемый объект от Core Data? - PullRequest
4 голосов
/ 03 октября 2009

В проекте Core Data у меня есть две кнопки в моем интерфейсе (таблица), одна из которых редактирует данные о человеке и сохраняет их в БД, а другая позволяет визуально возиться с данными без сохраняя его в БД. Как «отсоединить» основной объект данных, чтобы он не записывал данные в БД? Я попытался написать новый класс NSObject, который имитирует класс NSManagedObject, а затем переместить данные в класс NSObject, но он все еще изменяет базу данных!

//button for editing and saving
PersonObj *person = (PersonObj *)[fetchedResultsController objectAtIndexPath:indexPath];
PersonEditViewController *editViewController = [[PersonEditViewController alloc] initWithStyle:UITableViewStyleGrouped];
// puts the managed object into the new view controller
editViewController.person = person;
[self.viewController pushViewController:editViewController animated:animated];
[editViewController release];

//button for editing and NOT saving
PersonObj *person = (PersonObj *)[fetchedResultsController objectAtIndexPath:indexPath];
PersonFiddlingViewController *fiddling = [[PersonFiddlingViewController alloc] initWithStyle:UITableViewStyleGrouped];
// move db data into non-db class??? not working
fiddling.eyeColor = person.eyeColor;
fiddling.name = person.name;
[self.viewController pushViewController:fiddling animated:animated];
[fiddling release];

Ответы [ 2 ]

2 голосов
/ 06 октября 2009

Не думаю, что вы понимаете, как работает CD. Вы не можете отсоединить объект от CoreData, CD является резервным хранилищем для объекта.

Я также вполне уверен, что проблемы, с которыми вы сталкиваетесь, не связаны с кодом, который вы включили выше, потому что даже в первом случае в вашем коде нет ничего, что могло бы зафиксировать изменения в постоянном хранилище. При отсутствии вызова NSManagedObjectContext:save: все изменения в вашем графе объектов будут временными.

Другими словами, для того, чтобы делать то, что вы хотите (настраивать, не сохраняя), просто не вызывайте save: в контексте, в котором находится объект, после того, как вы его настроите. Если вам нужно сохранить другие изменения, вы можете либо явно откатить настройки перед сохранением, либо вы можете обернуть измененные объекты в их собственный контекст, прежде чем поиграться с ними:

NSManagedObjectContext *tweakingContext = [[NSManagedObjectContext alloc] init];
tweakingContext.persistentStoreCoordinator = person.managedObjectContext.persistentStoreCoordinator;
PersonObj *tweakablePerson = [tweakingContext objectWithID:person.managedObjectID];

//Do your stuff

[tweakingContext release];

Приведенный выше код предоставит вам новый объект (tweakablePerson), в котором обнаружены ошибки из тех же данных, что и персона, но в независимом контексте вы никогда не сохраните. Если вы когда-нибудь захотите сохранить его, вы можете, но вам придется решать другие проблемы (потенциальные конфликты сохранения, если произошли другие сохранения).

Опять же, хотя это отвечает на вопрос, который вы задаете, я не думаю, что это решит вашу проблему, потому что проблема почти наверняка не в коде выборки или создания объекта (который вы показываете), а в коде сохранения, который Вы не перечислены.

0 голосов
/ 05 октября 2009

Я использую Core Data всего несколько дней (просто преобразовал проект, чтобы использовать его для хранения пользовательских данных), но то, что вы описываете, не имеет смысла. Как резервное хранилище (db) может сохранять изменения, если вы не фиксируете изменения, используя где-нибудь NSManagedObjectContext:save:? Можете ли вы разместить свой код, где вы вызываете этот метод? Возможно, вы по ошибке делаете это из какого-то другого контекста (может быть, viewDidLoad: или что-то в этом роде).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...