Iphone 向CoreData应用程序添加新对象时出现问题

Iphone 向CoreData应用程序添加新对象时出现问题,iphone,objective-c,core-data,Iphone,Objective C,Core Data,又一天,又一个CoreData问题,……但希望现在是最后一个问题 好的,这是我的一份副本: 我有一份住在一个房间并有偏好的酒店客人名单。准备好后,用户应选择一位客人并查看数据,还应能够添加新客人、选择房间(也由应用程序维护)并选择他们的首选项(用户还可以添加新的首选项)。客人可以没有或有很多偏好 这就是我到目前为止的情况。我创建了3个实体:-具有roomnumber的房间-具有名称的首选项-具有名称的GuestInfo->具有这些关系房间(目标房间)和prefs(具有“到多个关系”的目标首选项)

又一天,又一个CoreData问题,……但希望现在是最后一个问题

好的,这是我的一份副本:

我有一份住在一个房间并有偏好的酒店客人名单。准备好后,用户应选择一位客人并查看数据,还应能够添加新客人、选择房间(也由应用程序维护)并选择他们的首选项(用户还可以添加新的首选项)。客人可以没有或有很多偏好

这就是我到目前为止的情况。我创建了3个实体:-具有roomnumber的房间-具有名称的首选项-具有名称的GuestInfo->具有这些关系房间(目标房间)和prefs(具有“到多个关系”的目标首选项)。创建托管对象类时,prefs是一个NSSet

现在,我创建了一个UITableViewController来显示所有数据。我也有一个编辑和添加模式。当我添加一个新客人并只填写姓名时,一切都正常。但当我想添加prefs或房间号时,我会出现以下错误:

非法尝试在不同上下文中的对象之间建立关系“房间”

现在,让我困惑的是,当我添加一个客人并只输入姓名时,保存它,返回并编辑它,然后选择prefs和房间号,它会工作吗

我在两个视图控制器中都有这一行,用于选择房间或首选项:

[editedObject setValue:selectedRoom forKey:editedFieldKey];
关于这一点,h:

NSManagedObject *editedObject;
NSString *editedFieldKey;
NSString *editedFieldName;
同样,它在编辑模式下工作,但在我想要添加新对象时不工作

可以肯定的是,这就是我为添加新来宾所做的:

- (IBAction)addNewItem 
{

    AddViewController *addViewController = [[AddViewController alloc] initWithStyle:UITableViewStyleGrouped];
    addViewController.delegate = self;
    addViewController.context = _context;

    // Create a new managed object context for the new book -- set its persistent store coordinator to the same as that from the fetched results controller's context.
    NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] init];
    self.addingManagedObjectContext = addingContext;
    [addingContext release];

    [addingManagedObjectContext setPersistentStoreCoordinator:[[_fetchedResultsController managedObjectContext] persistentStoreCoordinator]];

    GuestInfo *info = (GuestInfo *)[NSEntityDescription insertNewObjectForEntityForName:@"GuestInfo" inManagedObjectContext:addingContext];

    addViewController.info = info;

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:addViewController];

    [self.navigationController presentModalViewController:navController animated:YES];

    [addViewController release];
    [navController release];
}
我需要做什么来初始化房间或Prefs?
希望有人能帮我。谢谢

您遇到的问题与您(错误)使用NSManagedObjectContext对象密切相关。基本上,您不能使用两个不同的托管对象上下文来建立由_context管理的对象与另一个由addingContext管理的对象之间的关系。创建新的NSManagedObjectContext并将其传递给要推送到堆栈上的视图控制器仅在将新对象添加到此上下文时有效,但在属于不同NSManagedObjectContext对象的对象之间建立关系时无效


这就是为什么您会收到消息“非法尝试在不同上下文中的对象之间建立“房间”关系”。要解决此问题,请使用您的_context对象创建并保存新对象。

您遇到的问题与您(错误)使用NSManagedObjectContext对象密切相关。基本上,您不能使用两个不同的托管对象上下文来建立由_context管理的对象与另一个由addingContext管理的对象之间的关系。创建新的NSManagedObjectContext并将其传递给要推送到堆栈上的视图控制器仅在将新对象添加到此上下文时有效,但在属于不同NSManagedObjectContext对象的对象之间建立关系时无效


这就是为什么您会收到消息“非法尝试在不同上下文中的对象之间建立“房间”关系”。要解决此问题,请使用_context对象创建并保存新对象。

不要创建新的上下文。您必须使用之前创建房间的相同上下文。为什么每次添加新项目时都要创建新上下文?这就是为什么你会出错。除非您有线程问题,否则您应该在应用程序启动或加载数据时创建一个上下文,然后在整个过程中使用它。即使有线程问题,通常每个线程只有一个上下文(或者每个临时数据集至少有一个上下文)。

不要创建新上下文。您必须使用之前创建房间的相同上下文。为什么每次添加新项目时都要创建新上下文?这就是为什么你会出错。除非您有线程问题,否则您应该在应用程序启动或加载数据时创建一个上下文,然后在整个过程中使用它。即使有线程问题,通常每个线程也应该只有一个上下文(或者每个临时数据集至少有一个上下文)。

我刚才也在写一个类似的答案。我要补充的唯一一点是,当选中核心数据选项创建时,它可能有助于海报查看iPhone/iPad项目模板。该模板显示了如何在应用程序委托中设置核心数据堆栈,并将NSManagedObjectContext传递给顶级(根)视图控制器,然后该控制器可以将其传递给它所推送的各种视图控制器。主运行中心只能创建一次(如您所述)+1感谢您提供的信息,我只是通过使用_上下文进行了尝试,但没有成功。我现在使用的是addingContext,但我不确定为什么,因为这似乎不正确。你能更详细地告诉我应该如何使用_上下文或发布addNewItem的重新剪辑吗?感谢Matt所建议的LotusAs,请看一下初始化核心数据堆栈并将初始化的上下文正确传递给(比如)根视图控制器的标准源代码。然后,要添加新项,请创建新项,分配并初始化添加控制器,最后将上下文和创建的项传递给新控制器。将控制器放在堆栈上,并根据需要做出反应:如果用户想要保存项目,则保存它;否则,通过删除创建的项目并保存上下文来放弃该项目。context和item都是adding controller的属性。好吧,我用自己的方式阅读了Apple的Book CoreData示例,这就是我的代码的来源。我还是找不到合适的解决办法。如果我使用“addingContext”,我会得到错误,但是如果我重新使用上下文,如果我按cancel,我会添加一个新项目。任何人都可以告诉我如何避免这种情况?如果需要丢弃对象,请删除它并保存上下文。这个可以是b