2010-03-20 2 views
1

J'ai essayé de trouver un moyen de résoudre mon problème, mais chaque solution que je peux penser est salissante et me fait envie de vomir.Je cherche une façon élégante de stocker une relation un-à-plusieurs dans un coredata lorsque la commande est importante

J'ai une relation un-à-plusieurs, constituée d'un objet Team pouvant contenir plusieurs objets membres. Quand j'ai construit mon modèle de données en utilisant Xcode, on m'a donné le NSSet par défaut pour stocker les objets membres, malheureusement les Sets ne sont pas commandés et je dois préserver l'ordre des objets Member et j'ai besoin de savoir s'il y a des espaces vides entre Membres. J'ai pensé à Utiliser un NSArray à la place de NSSet et créer un objet membre fictif dans mon magasin de données que je pourrais utiliser pour marquer une place vacante entre des objets membres, mais cette solution semble vraiment être un hack pour moi. Puisque je devrai toujours filtrer ce membre factice de n'importe quelles questions. Un NSDictionary serait parfait car je pourrais stocker les références d'objets Member et leurs positions en tant que paires Object-Key (en prenant soin à la fois de l'ordre et des lacunes) mais apparemment CoreData ne supporte pas NSDictionary.

Est-ce que quelqu'un a eu un besoin similaire, et a conçu une solution simple?

+0

[Les données de base prennent désormais en charge les relations ordonnées à plusieurs utilisant NSOrderedSet.] (Http://developer.apple.com/library/mac/releasenotes/DataManagement/RN-CoreData/index.html#//apple_ref/doc/ uid/TP40010637-CH1-DontLinkElementID_3) Plus d'informations peuvent être trouvées avec un Google rapide. J'espère que les réponses seront mises à jour pour ne plus tromper (pas délibérément!) Les newbs comme moi. Je viens juste de passer une demi-heure à chercher ça, grâce à l'excellent [Rob Rix] (https://twitter.com/rob_rix) qui m'a dit. – Swizzlr

Répondre

4

Les relations ordonnées sont triviales à implémenter. Here's the code I did for one of NSManagedObject subclasses.

(. Pour une raison quelconque, je ne peux pas poster le code formaté pour Stackoverflow aujourd'hui)

Dans ce cas, j'ai une relation mise en place comme:

AlphaEnity<-->>AlphaToBetaEntity<<-->BetaEntity 

Le AlphaToBetaEntity a une order Attribut. Je trie le AlphaToBetaEntity, puis retourne le BetaEntity lié comme nécessaire. C'est comme faire un tri de pointeur dans la vieille école C.

Cela a l'avantage d'être très rapide sur de très gros ensembles et vous n'avez pas à faire de faute dans BetaEntity tant que vous n'avez pas besoin d'en lire un attribut.

+0

Juste une mise à jour: j'ai finalement réussi à implémenter votre solution.Au début, j'ai pensé que j'irais avec les recommandations ci-dessus, mais votre solution s'est avérée être un meilleur ajustement pour mes relations. Avoir un objet de commande intermédiaire s'est avéré ne pas être aussi horrible que je le pensais puisque cela correspond au contexte de mon modèle de données, merci! J'aimerais pouvoir marquer deux solutions comme acceptées! –

3

L'absence de relations ordonnées entre les données de base et les autres est un artefact de la conception de base de données sous-jacente. Les raisons de ceci, ainsi que les solutions potentielles, sont discutées dans this Cocoa mailing list thread. Les solutions incluent l'ajout d'une propriété d'index à vos objets gérés ou la gestion de ces objets dans une liste chaînée. Si vous ne voulez pas le faire vous-même, Brian Webster a mis en place une implémentation de relations de données de base ordonnées à-plusieurs here. Enfin, si vous souhaitez abandonner Core Data, le nouveau BNRPersistence framework d'Aaron Hillegass prend en charge les relations ordonnées.

+0

Apparemment, mon googlefu est faible aujourd'hui. Merci ou me pointant dans la bonne direction. La solution ordonnée de Brian à plusieurs ressemble exactement à ce dont j'ai besoin. –

Questions connexes