如何从Core Data分离托管对象?

时间:2009-10-03 01:35:49

标签: iphone core-data

在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 个答案:

答案 0 :(得分:2)

我认为您不了解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),但在独立的上下文中,您永远不会保存。如果您确实希望保存它,但您必须处理其他问题(如果发生其他保存,可能会发生冲突)。

同样,虽然这回答了你问的问题,但我认为它不会解决你的问题,因为问题几乎肯定不在fetch或对象创建代码(你展示的)中,而是在保存代码中你还没有列出。

答案 1 :(得分:0)

我现在只使用Core Data几天了(刚刚转换了一个项目用它来存储用户数据),但是你描述的内容没有意义。除非您使用NSManagedObjectContext:save:在某处提交更改,否则后备存储(db)如何保存更改?你可以在你调用该方法的地方发布你的代码吗?也许你错误地从其他一些背景(也许是viewDidLoad:或其他)中做到了。