另一天,另一个CoreData问题,...但希望现在是最后一个。
好的,这是我所拥有的副本:
我有一个酒店客人名单,住在一个房间,并有首选项。准备好后,用户应选择一个访客并查看数据,并且还应该能够添加新访客,选择房间(也由应用程序维护)并选择他们的首选项(用户还可以添加新的首选项)。客人可以没有或有很多偏好。
所以这就是我到目前为止所拥有的。我创建了3个实体: - 带房间号的房间 - 带名字的偏好 - 带名字的GuestInfo - >使用这些Relationships房间(目标房间)和prefs(具有“To-Many Relationship”的目标首选项)当您创建托管对象类时,prefs是一个NSSet。
现在我创建了一个UITableViewController来显示所有数据。我也有编辑和添加模式。当我添加一个新的Guest并只填写名称时,一切正常。但是当我想添加prefs或房间号码时,我收到了这个错误:
非法尝试在不同背景下的对象之间建立关系“空间”
现在,让我感到困惑的是,当我添加一个访客并输入名称时,保存它,返回并编辑它并选择它有效的首选项和房号?
我在两个ViewControllers中都有这一行来选择房间或首选项:
[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? 希望有人可以帮助我。感谢
答案 0 :(得分:2)
您遇到的问题与您(错误地)使用NSManagedObjectContext对象严格相关。基本上,您不能使用两个不同的托管对象上下文来建立_context管理的对象与另外一个通过addsContext管理的对象之间的关系。创建新的NSManagedObjectContext并将其传递给要在堆栈上推送的视图控制器只有在要向此上下文添加新对象时才有效,但如果要在属于不同NSManagedObjectContext对象的对象之间建立关系则不行。
这就是为什么你收到消息“非法尝试在不同环境中的对象之间建立关系'房间”的原因。要解决此问题,请使用_context对象创建并保存新对象。
答案 1 :(得分:1)
不要创建新的上下文。您必须使用之前创建房间的相同上下文。为什么每次添加新项目时都要创建新的上下文?这就是你得到错误的原因。除非您遇到线程问题,否则应在应用程序启动或加载数据时创建单个上下文,然后在整个过程中使用它。即使存在线程问题,通常每个线程只应有一个上下文(或每个临时数据集至少有一个上下文)。