- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个基于 CoreDataBooks 示例的应用程序,它使用 addingManagedObjectContext
将 Ingredient
添加到 Cocktail
以撤消整个添加。 CocktailsDetailViewController
依次调用 BrandPickerViewController
来(可选)为给定成分设置品牌名称。 Cocktail
、Ingredient
和Brand
都是NSManagedObjects
。 Cocktail
需要至少设置一种Ingredient
(baseLiquor
),所以我在创建Cocktail
时创建它.
如果我在 CocktailsAddViewController : CocktailsDetailViewController
中添加 Cocktail
(在保存时合并到 Cocktail 托管对象上下文中)而不设置 baseLiquor.brand
,然后它可以从 CocktailsDetailViewController
的选择器(也存储在 Cocktails 托管上下文中)设置 Brand
。
但是,如果我尝试在 CocktailsAddViewController
中设置 baseLiquor.brand
,我会得到:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'brand' between objects in different contexts'
来自 this question我知道问题是 Brand
存储在应用程序的 managedObjectContext
中,新添加的 Ingredient
和 Cocktail
是存储在 addingManagedObjectContext
中,传递 ObjectID
可以避免崩溃。
我不明白的是如何通用地实现选择器,以便所有成分(baseLiquor
、mixer
、garnish
、等) 可以在添加期间设置,也可以在创建 Cocktail
之后从 CocktailsDetailViewController
逐一设置。换句话说,按照 CoreDataBooks 示例,在添加和编辑情况下,ObjectID
何时何地从父 MOC 转换为 NSManagedObject
? -IPD
更新 - 这是添加方法:
- (IBAction)addCocktail:(id)sender {
CocktailsAddViewController *addViewController = [[CocktailsAddViewController alloc] init];
addViewController.title = @"Add Cocktail";
addViewController.delegate = self;
// 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]];
Cocktail *newCocktail = (Cocktail *)[NSEntityDescription insertNewObjectForEntityForName:@"Cocktail" inManagedObjectContext:self.addingManagedObjectContext];
newCocktail.baseLiquor = (Ingredient *)[NSEntityDescription insertNewObjectForEntityForName:@"Ingredient" inManagedObjectContext:self.addingManagedObjectContext];
newCocktail.mixer = (Ingredient *)[NSEntityDescription insertNewObjectForEntityForName:@"Ingredient" inManagedObjectContext:self.addingManagedObjectContext];
newCocktail.volume = [NSNumber numberWithInt:0];
addViewController.cocktail = newCocktail;
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:addViewController];
[self.navigationController presentModalViewController:navController animated:YES];
[addViewController release];
[navController release];
}
这是 Brand
选择器中的崩溃位置(此 NSFetchedResultsController
由应用委托(delegate)的托管对象上下文支持:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
if ([delegate respondsToSelector:@selector(pickerViewController:didFinishWithBrand:forKeyPath:)])
{
[delegate pickerViewController:self
didFinishWithBrand:(Brand *)[fetchedResultsController objectAtIndexPath:indexPath]
forKeyPath:keyPath]; // 'keyPath' is @"baseLiquor.brand" in the crash
}
}
最后是委托(delegate)实现:
- (void)pickerViewController:(IngredientsPickerViewController *)pickerViewController
didFinishWithBrand:(Brand *)baseEntity
forKeyPath:(NSString *)keyPath
{
// set entity
[cocktail setValue:ingredient forKeyPath:keyPath];
// Save the changes.
NSError *error;
if (![cocktail.managedObjectContext save:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
// dismiss picker
[self.navigationController popViewControllerAnimated:YES]
}
更多
我正在根据 Marcus 的建议取得进展——我将 addingManagedObjectContexts
映射到父 managedObjectContext 并将所有内容包装在 begin/endUndoGrouping
中以处理取消与保存.
但是,要创建的对象位于 NSFetchedResultsController
中,因此当用户点击“+”按钮添加 Cocktail
时,(可能是 - be-undone) 实体在呈现模态添加 View Controller 时短暂出现在 TableView 中。 MDN 示例是基于 Mac 的,因此它不涉及此 UI 行为。我该怎么做才能避免这种情况?
最佳答案
听起来您正在创建两个不同的核心数据堆栈(NSManagedObjectContext
、NSManagedObjectModel
和NSPersistentStoreCoordinator
)。从示例中您想要做的只是创建两个指向相同 NSPersistentStoreCoordinator
的 NSManagedObjectContext
实例。这将解决此问题。
将 NSManagedObjectContext
视为便笺本。您可以拥有任意数量,如果您在保存之前将其丢弃,则其中包含的数据将消失。但它们都保存到同一个地方。
不幸的是,CoreDataBooks 是一个非常糟糕的例子。但是,对于您的问题,我建议删除 附加上下文的创建并查看是否发生错误。根据您发布的代码,我假设您直接从 Apple 的示例中复制了代码,双重上下文虽然几乎没有用,但应该可以正常工作。因此,我怀疑还有其他因素在起作用。
尝试使用单个上下文并查看问题是否仍然存在。您可能有其他一些有趣但微妙的错误导致您出现此错误;也许是某个地方或某些地方的过度释放。但第一步是删除双重上下文,看看会发生什么。
如果即使只有一个 MOC 也会崩溃,那么您的问题与上下文无关。单个 MOC 出现的错误是什么?当我们解决这个问题时,我们将解决您的整个问题。
至于更好的解决方案,请改用 NSUndoManager
。这就是它的设计目的。 Apple 真的不应该在他们的示例中推荐多个 MOC。
我最近在这里回答了一个关于将 NSUndoManager
与 Core Data 一起使用的问题,但您也可以查看我在 MDN 上的一些文章作为示例。
关于iphone - NS无效参数异常 : Illegal attempt to establish a relationship between objects in different contexts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2416647/
我有这样的结构: class User(DeclarativeBase): ... teamMemberships = orm.relationship("TeamXREF",backre
我需要提取值 11,12 和 1,即 = 之后的值。 我正在尝试执行以下操作 Matcher m = Pattern.compile("\\((.*?)\\)").matcher(s); while
有三个表/模型: 客户: id - 客户端 品牌: id - 品牌 品牌型号: id - 型号 - Brand_id 品牌模型客户: id - Brandmodel_id - client_id 我希
在我的应用程序核心数据模型中,我有工作表和文本实体。工作表实体可以有两个文本:privacyNotes 和 termsOfUse。 都是文本类型。因此,在 XCode 数据建模器中,我在带有文本目标的
在现有的网络应用程序 (PHP/MySQL) 上工作,我得出了这一点:我有 2 个表存储名称和类型 ID。它们之间的关系是 NN 我之间有另一个表。 (见图) 我有一个名为“category”的最后一
当我创建一对一关系迁移时,laravel 创建一对多关系。 PHP 7.1 和 MySQL 5.7 模型是:角色和用户。 角色: public function user() { return
我有一个巨大的痛苦的继承表,其中包含几百万条记录,我无法有效地查询。表格看起来有点像这样: id | submissionId | key | value ------------------
我有两个实体,相册和照片,它们之间存在多对多关系。一切正常。我想要的是添加一个关系属性,即除了 album_id 和 photo_id 之外的映射的额外属性,例如添加照片的日期时间或表明照片在该相册中
过去几天我一直在努力解决我的问题,遗憾的是没有任何结果。我已经在这里阅读了无数关于这个主题的帖子,但我一直遇到同样的错误。 “'字段列表'中的未知列'Extent1.foo_id'”......我做错
我正在尝试映射两个实体之间的多对多关系,但我需要使用多个属性来装饰该实体 - 请参见下图: Reads 是我在这种情况下的关系表 - 我在上面添加了一个标识列以避免使用复合键,但这里有值(value)
我正在使用 Spring Data/Neo4j 和 REST API 开发一个 Web 应用程序。 我想知道我是否可以创建一种关系并以另一种关系结束,如下所示: @RelationshipEntity
您好,我在进行 Laravel 查询时遇到问题 模型区域 class Region extends Model { protected $table = 'regions'; prot
考虑以下场景: 我的 Laravel 应用程序中有几个实体,如下所示: 发布 页面 图片 视频 以上所有实体都可以有CustomFieldValue,这是另一个实体。 custom_field_val
乍一看,它们似乎在做同样的事情:定义一对多关系 那么你为什么要选择一个或另一个? 最佳答案 EmbedsMany - 嵌入另一个模型的许多实例的模型;例如,一个客户可以有多个电子邮件地址,每个电子邮件
我是 Neo4j 的新手,只是为了深入学习。我有一个小小的疑问,例如, 如果我在空间中创建了两个节点并提供了这两个节点之间的关系以及系统时间(知道它们在什么时间成为 friend )。 所以现在我的问
我想知道是否有人可以帮助我。 这就是我需要做的:将语言表的 ID 拉入新表中,并使其之间具有唯一的关系。就像节点的公式 n(n-1) 一样。 我尝试使用笛卡尔积,但它不起作用,因为列 a = 1 和列
如何识别关系是三元关系还是聚合关系? 例如:一名球员在他参加的比赛中获得奖励。如果实体是玩家、比赛和奖励,这是三元还是聚合? 最佳答案 一个讲师给我的答案,它是一个三元关系,因为涉及到 3 个贡献实体
实体关系是否有标准(非图形)表示法? 现在我正在使用我自己的 janky 符号: 用户 >> 照片, (1-many) 用户 > 个人资料,(1-1 hasOne) 个人资料 标签,(多对多) 最佳
假设有两个实体,名为 Employee 和 Campaign。一名员工可以参与多个事件。一个事件可以有很多员工。我已经知道这是一个多对多的关系。 绘制ER图时(用陈符号),这种关系用菱形来表示。但是对
以下ER图中的双线是表示完全参与还是递归关系? 谁能告诉我两者的符号区别? 最佳答案 总参与人数:集合中的每个实体都涉及关系的某个关联(或元组)。 递归关系:与自身相关的实体集。 在递归关系中最常见的
我是一名优秀的程序员,十分优秀!