2009-09-12 8 views
0

J'ai deux entités qui sont reliées par un à plusieurs, disons CategoryEntity et ItemEntity. La relation est facultative pour CategoryEntity (il peut y avoir des catégories sans éléments), mais obligatoire pour chaque ItemEntity. Au chargement de l'application, les catégories existent déjà dans le magasin, et je veux importer ItemEntities et les connecter au CategoryEntity approprié.Définir une relation avec Core Data

Il est évident que l'exécution d'un FetchRequest pour chaque ItemEntity pour trouver la catégorie correspondant ne serait pas une bonne solution, car il y aura environ 4000-6000 articles à chaque fois ..

Alors, est-il quelque chose de plus efficace que je pouvais faire ?

+0

Les extractions sont utilisées pour récupérer des objets gérés (OM). Pouvez-vous clarifier votre question? Demandez-vous comment affecter une instance MO CategoryEntity à une instance MO ItemEntity? Ou demandez-vous comment extraire une liste de MO ItemEntity qui n'ont pas d'affectation CategoryEntity, et leur assigner un MO CategoryEntity spécifique? –

+0

Oui, je crains de ne pas avoir été très clair dans ma question. Je demande comment affecter une instance MO CategoryEntity aux instances MO ItemEntity nouvellement créées. Chaque MO ItemEntity doit cependant être affecté au MO CategoryEntity approprié. Je pense que je l'ai fait en utilisant un dictionnaire pour une référence plus rapide des catégories, mais toute meilleure architecture est la bienvenue. – johnl

Répondre

2

Si vous avez correctement configuré votre modèle de données de base, vous avez une relation de-plusieurs entre l'entité de catégorie et l'entité de l'élément, et une relation inverse de un de l'élément vers la catégorie. En outre, vous avez une règle de suppression "en cascade" pour la relation "à plusieurs" et une règle de suppression "annulée" pour la relation à un. En supposant que, à chaque fois que vous insérez un objet Item, la définition de sa relation Catégorie insère automatiquement l'élément dans la catégorie correspondante. La suppression d'un élément le supprime automatiquement de la catégorie correspondante.

Du côté de la catégorie, la suppression d'une catégorie supprime automatiquement tous les objets Item correspondants. Par conséquent, lorsque vous récupérez des éléments, vous avez déjà récupéré pour chaque objet Elément son objet Catégorie correspondant. Vous n'avez pas besoin de faire autre chose. Notez que, par défaut, vous ne récupérez pas réellement l'objet Category pendant l'extraction: à la place, une erreur est déclenchée la première fois que vous essayez d'accéder à l'objet et que l'objet est récupéré à ce moment. Ceci fournit de meilleures performances si vous ne prévoyez pas d'utiliser immédiatement l'objet Catégorie stocké dans l'objet Item récupéré. Si vous prévoyez d'utiliser l'objet Catégorie presque à chaque fois que vous allez chercher un article, vous devez utiliser les méthodes NSFetchRequest

- (void)setReturnsObjectsAsFaults:(BOOL)yesNo 
- (void)setRelationshipKeyPathsForPrefetching:(NSArray *)keys 

dire des données de base que vous voulez maintenant des défauts et que vous demandez préchargement votre relation de catégorie.

0

Lorsque vous dites 'importer' des entités d'articles, que voulez-vous dire? Sont-ils dans un autre magasin de données de base, défini dans un autre format dans un fichier quelque part, récupéré sur le réseau? Une approche serait d'aller chercher toutes les catégories en une fois et de les ajouter à un NSDictionary agissant comme un cache et saisi par une valeur d'identification qui vous permet d'effectuer une recherche rapide. Pour chaque entité d'élément que vous instanciez lors de l'importation (quel que soit ce que cela signifie), récupérez son ID de catégorie, puis récupérez le MO de catégorie dans le cache. Définissez la relation, puis enregistrez. Encore mieux, lot un certain nombre d'insertions et enregistrer tous les 10, 100 ou 1000 pour réduire les frais généraux d'E/S.

Questions connexes