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 关系,其中包含三个对象SteveJohnMike。与Steve 建立两个关系在逻辑上是荒谬的,因为对象模型的真正史蒂夫不是简的兄弟两次。即使 Jane 确实有两个名为 Steve 的兄弟,他们仍然是独立的个体,需要他们自己的对象在对象图中表示它们。

如果您发现自己认为需要重复关系,那么您可能误解了对象图的工作原理。

【讨论】:

【参考方案2】:

我遇到了类似的问题并进行了搜索,但找不到任何东西。确实,我对这种关系的看法是错误的。

该应用程序正在将一堆Items 排列在Board 上,并按顺序重复。

前。做A,做B,做C,再做A,做D

我用ItemBoard 和称为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:如何在一个关系中保存一个对象两次的主要内容,如果未能解决你的问题,请参考以下文章

Core-Data 后台保存性能问题

使用 xcode 和 core-data 中的代码创建托管对象

IOS/Core-Data:添加多对多关系

Core-Data NSFetchedResultsController 对多关系

Core-Data:想要将新的 web xml 内容持久保存到我的数据存储中,而不是替换现有的

如何使用 core-data 存储一个值? (迅速 2)