2 votes

Core-Data : comment sauvegarder un objet deux fois dans une même relation

Disons que j'ai un NSManagedObject A, qui a une relation many-to-many avec un NSManagedObject B. J'ai une instance sauvegardée de A et de B (pas encore liés).

Maintenant, je veux que A enregistre deux fois l'instance de B dans sa relation, qui est bien sûr un ensemble. Cependant, comme il s'agit d'un ensemble, il ne stocke qu'une seule référence de B.

voir : (pas de contrôle syntaxique)

NSArray *tmpArray = [NSArray arrayWithObjects: B1, B1, nil];
[A setB: [NSSet setWithArray: tmpArray]];

-> un seul B est stocké dans cette relation..

Est-il possible de garder la trace des deux B ?

4voto

TechZen Points 52692

Vous ne pouvez pas faire ça. Core Data ne gère pas un tableau mais un graphique-objet.

Un graphe d'objets stocke les relations entre les objets. Puisque chaque objet est unique, il n'est pas logique d'avoir une relation dupliquée car cela ne transmet aucune information. Supposons que vous ayez un objet Person instance Jane qui a un brothers qui contient trois objets, Steve , John y Mike . Il serait logiquement absurde d'avoir deux relations pour Steve parce que le vrai Steve que l'objet modélise n'est pas deux fois le frère de Jane. Même si Jane avait deux frères nommés Steve, ils seraient toujours des individus distincts nécessitant leurs propres objets pour les représenter dans le graphe d'objets.

Si vous pensez avoir besoin de relations dupliquées, c'est que vous avez probablement mal compris le fonctionnement du graphe d'objets.

1voto

Zotter Points 141

J'ai eu un problème similaire et j'ai cherché mais je n'ai rien trouvé. En effet, j'ai mal envisagé la relation.

L'application arrange un tas de Items sur un Board en séquence avec des répétitions.

EX. Faire A, Faire B, Faire C, Faire A à nouveau, Faire D

J'ai créé une bonne vieille table de jonction avec le fichier Item , Board et la position sur le tableau est appelée BoardItemPositon .

De la Board vous pouvez masquer tout le désordre de la table de jonction et obtenir et définir un tableau.

@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;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X