【问题标题】:How to detach a managed object from Core Data?如何从 Core Data 中分离托管对象?
【发布时间】:2009-10-03 01:35:49
【问题描述】:

在一个 Core Data 项目中,我的界面上有两个按钮(一个表格),一个用于编辑关于一个人的数据并将其保存到数据库中,另一个让您可以直观地摆弄数据而无需实际操作将其保存到数据库。 如何“分离”核心数据对象,以便它不会将数据写入数据库?我试图编写一个模仿 NSManagedObject 类的新 NSObject 类,然后将数据移动到 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];

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    我认为您不了解 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),它是从与人相同的数据中出错的,但在一个独立的上下文中你永远不会保存。如果您确实想保存它,您可以,但您必须处理其他问题(如果发生其他保存,可能会发生保存冲突)。

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

    【讨论】:

      【解决方案2】:

      我现在才使用 Core Data 几天(刚刚转换了一个项目以使用它来存储用户数据),但是您所描述的没有意义。除非您在某处使用NSManagedObjectContext:save: 提交更改,否则后备存储(db)如何保存更改?您可以在调用该方法的地方发布代码吗?也许您是从其他上下文(可能是viewDidLoad: 或其他什么)错误地执行此操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 2020-11-23
        相关资源
        最近更新 更多