Core-Data:如何在一个关系中保存一个对象两次
Posted
技术标签:
【中文标题】Core-Data:如何在一个关系中保存一个对象两次【英文标题】:Core-Data: how to save an object twice in one relationship 【发布时间】:2010-09-16 19:19:14 【问题描述】:假设我有 NSManagedObject A,它与 NSManagedObject B 有多对多的关系。 我保存了一个 A 和 B 的实例。(尚未相关)
现在我希望 A 在其关系中保存 B 的实例两次,这当然是一个集合。 不过,由于它是一个集合,它只存储一个 B 的引用。
请参阅:(未检查语法)
NSArray *tmpArray = [NSArray arrayWithObjects: B1, B1, nil];
[A setB: [NSSet setWithArray: tmpArray]];
-> 只有一个 B 存储在该关系中..
是否可以同时跟踪两个 B?
【问题讨论】:
TechZen 是正确的。 100% 同意。所以问题是:您要解决的问题是什么,这使您认为需要将对象 A 和 B1 之间的关系存储两次?如果您能解释这一点,我们或许可以建议您如何以另一种方式实现目标。 【参考方案1】:你不能这样做。 Core Data 维护的不是数组而是对象图。
对象图存储对象之间的关系。由于每个对象都是唯一的,因此存在重复关系是没有意义的,因为这不会传达任何信息。假设您有一个对象Person
实例Jane
,它具有brothers
关系,其中包含三个对象Steve
、John
和Mike
。与Steve
建立两个关系在逻辑上是荒谬的,因为对象模型的真正史蒂夫不是简的兄弟两次。即使 Jane 确实有两个名为 Steve 的兄弟,他们仍然是独立的个体,需要他们自己的对象在对象图中表示它们。
如果您发现自己认为需要重复关系,那么您可能误解了对象图的工作原理。
【讨论】:
【参考方案2】:我遇到了类似的问题并进行了搜索,但找不到任何东西。确实,我对这种关系的看法是错误的。
该应用程序正在将一堆Items
排列在Board
上,并按顺序重复。
前。做A,做B,做C,再做A,做D
我用Item
、Board
和称为BoardItemPositon
的董事会职位创建了一个很好的老式联接表。
从Board
实体中,您可以隐藏所有的连接表混乱并获取和设置一个数组。
@implementation Board
@dynamic boardItems;
- (void)setItems:(NSArray *)items
//the ordered set of links
NSMutableOrderedSet *boardItemSet = [NSMutableOrderedSet new];
int i = 1;
for (Item *item in items)
BoardItemPosition *boardItemPosition = (BoardItemPosition *)[NSEntityDescription insertNewObjectForEntityForName:@"BoardItemPosition"
inManagedObjectContext:[self managedObjectContext]];
NSNumber *num = [NSNumber numberWithInt:i++];
[boardItemPosition setItemPosition:num];
[boardItemPosition setItem:item];
[boardItemSet addObject:boardItemPosition];
//delete the old links
for (BoardItemPosition *boardItemPosition in [self boardItems])
[self.managedObjectContext deleteObject:[self.managedObjectContext objectWithID:boardItemPosition.objectID]];
//set the new links
[self setBoardItems:boardItemSet];
- (NSArray *)items
//pull out item and add to array
NSMutableArray *itemArray = [NSMutableArray new];
for (BoardItemPosition *boardItemPosition in [self boardItems])
[itemArray addObject:[boardItemPosition item]];
return itemArray;
【讨论】:
以上是关于Core-Data:如何在一个关系中保存一个对象两次的主要内容,如果未能解决你的问题,请参考以下文章
使用 xcode 和 core-data 中的代码创建托管对象
Core-Data NSFetchedResultsController 对多关系