2009-07-04 9 views
7

Je commence tout juste à utiliser Core Data sur le SDK iPhone et je cherche à enregistrer une liste ordonnée, quelque chose comme un tableau. Toutefois, les relations dans les données de base sont exprimées en tant que jeux lors de la récupération. Cela rend difficile la sauvegarde de l'ordre dans lequel les objets sont positionnés.Relations indexées dans les données de base

Un bon exemple serait des éléments de données dans la vue de tableau lorsque la réorganisation des éléments est autorisée. Une solution simple consisterait à inclure une propriété d'index sur l'objet géré.

Considérons la hiérarchie suivante:

document < -Beaucoup à many> DataItem

Différentes instances de document pourrait créer un lien vers le même DataItem, et chaque document peut faire référence à un ou plusieurs DataItem (s) . Par conséquent, avoir une propriété d'index dans DataItem entraînerait une moindre réutilisabilité de cette instance, c'est-à-dire que vous ne pouvez enregistrer que l'index d'une instance de Document.

Des idées sur la façon dont je peux présenter la hiérarchie ordonnée dans une vue de table tout en conservant chaque instance de DataItem réutilisable? Merci!

Répondre

3

Une bonne solution consiste à conserver une structure de données distincte dans Document pour mapper DataItems à une position dans la vue tabulaire. En plus d'autoriser le même DataItem à exister dans plusieurs positions, si vous devez ajouter un DataItem à plusieurs Documents, cette solution fonctionnera également. À l'époque où je cherchais différentes stratégies pour conserver les objets de données de base commandés, j'ai trouvé un blog post qui explique comment faire ceci en détail, y compris un exemple de code.

7

Vous pouvez le faire avec une autre entité, comme ceci: alt text http://gallery.me.com/davedelong/100084/Screenshot-20on-202009-07-04-20at-2010-34-56-20AM/web.jpg?ver=12467253090001

Un document pourrait trouver ses dataItems réelles en utilisant quelque chose comme ceci:

NSSet * documentDataItems = [[document orderedDataItems] valueForKey:@"dataItem"]; 

De même, un DataItem pourrait trouver tous ses documents en faisant de même:

NSSet * dataItemDocuments = [[dataItem orderedPositions] valueForKey:@"document"]; 
+0

La photo semble être cassée. –

+0

@BJ Homer - merci; Apparemment, twitpic n'aime pas les liens statiques. Je l'ai téléchargé sur MobileMe à la place. –

15

À partir de OS X Lion (10.7), ceci est maintenant beaucoup plus simple. Cocoa prend désormais en charge une nouvelle classe NSOrderedSet compatible avec Core Data. Cette fonctionnalité est également disponible dans iOS mais nécessite iOS 5.0 ou version ultérieure. Cela signifie que cela ne peut pas être utilisé si vous souhaitez que votre application soit rétrocompatible avec les versions antérieures d'iOS ou d'OS X.

Tout ce que vous devez faire pour obtenir une commande est d'ouvrir l'éditeur de modèle Core -la relation de plusieurs et cochez la case «commandé».

+0

Connaissez-vous de la documentation sur cette nouvelle API? Je l'ai seulement vu officiellement discuté dans les notes de version. Je voudrais savoir, par exemple, sur l'affichage des enregistrements par cet ordre dans une vue de table – Dov

+0

Il y a le lien dans ma réponse originale à la référence de classe de NSOrderSet. Cependant, je ne connais rien de spécifiquement concernant les meilleurs cas d'utilisation dans les vues de table. –

+1

'NSOrderedSet' ne peut actuellement pas être utilisé avec iCloud. –

Questions connexes