2010-11-18 2 views
5

J'ai une application Core Data basée sur des documents qui fonctionne telle quelle. Je voudrais ajouter le support pour un magasin persistant global pour tenir une bibliothèque d'articles.Application de base de données de données avec magasin persistant global

J'ai lu la plupart des documents pertinents et je comprends que je devrais utiliser des configurations dans les modèles d'objets gérés. J'ai défini deux configurations: "DocumentConfiguration" et "LibraryConfiguration". Les entités dans la configuration de document sont uniquement dans la configuration de document et les entités dans la configuration de bibliothèque sont uniquement dans la configuration de bibliothèque, c'est-à-dire, pas de chevauchement. Les docs disent alors "Vous utilisez ensuite ce modèle lorsque vous créez un coordinateur". Mais je ne crée pas mon propre coordinateur de magasin persistant puisque j'utilise le coordinateur NSPersistentDocument par défaut.

Quelques questions sur la meilleure façon de procéder et aider à dissiper tout malentendu je pourrais avoir:

A. Est-ce que j'obtenir le NSPersistentStoreCoordinator dans le NSPersistentDocument puis ajouter un nouveau magasin persistant le long des lignes de:

NSPersistentStoreCoordinator * coordinator = [[myDocument managedObjectContext] persistentStoreCoordinator]; 
[coordinator addPersistentStoreWithType:NSXMLStoreType 
    configuration:@"LibraryConfiguration" 
    URL:url 
    options:nil 
    error:&error]; 

Je pense que cela peut être un problème parce que je ne l'ai pas fourni l'autre définition de la configuration (le « DocumentConfiguration ») dans le coordinateur du magasin persistant du NSPersistentDocument que j'utilise la valeur par défaut fournie par NSPersistentDocument. Je suppose qu'il utiliserait probablement zéro quand le temps est venu de sauver le document. Et si oui, cela serait-il un problème? C'est-à-dire, comment le coordinateur peut-il savoir quel magasin persistant pour enregistrer une entité avec une définition de configuration donnée si les mêmes configurations ne sont pas définies pour tous les magasins persistants (dans ce cas deux)? Suis-je capable de définir la configuration (à "DocumentConfiguration") du stockage persistant de NSPersistentDocument avant qu'il ait été créé/enregistré? Des NSPersistentDocument docs:

Saving a new document adds a store of the default type with the chosen URL and invokes save: on the context. For an existing document, a save just invokes save: on the context.

B. Serait-il préférable de créer mes propres instances NSPersistentStoreCoordinator et NSManagedObjectContext, en ajoutant les deux magasins persistants avec des configurations définies, puis faire le NSPersistentDocument utiliser ces instances NSPersistentStoreCoordinator et NSManagedObjectContext et libre les anciens? Si oui, comment est-ce que je spécifierais l'URL pour le NSPersistentDocument pour la méthode addPersistentStoreWithType: ...? Il semble que cette URL ne soit connue qu'une fois le document sans titre sauvegardé. (En le testant, il ne semble pas y avoir de stockage persistant temporaire (via la méthode persistStores sur le coordinateur de stockage persistant) jusqu'à ce que le document soit enregistré pour la première fois). Ou serait-il préférable de laisser NSPersistentDocument seul et de créer ma propre instance de NSPersistentStoreCoordinator que j'utilise exclusivement pour le modèle de bibliothèque de stockage persistant et de bibliothèque gérée? Les docs disent que plusieurs instances de NSPersistentStoreCoordinator devraient être utilisées dans des applications de base de données multithread, mais je n'ai pas besoin de support de données de base multithread. Est-il souhaitable d'avoir deux instances de NSPersistentStoreCoordinator - une pour la bibliothèque et une pour les documents (l'intuition dit que ce n'est pas nécessaire et probablement pas la bonne approche)?

Des suggestions?

Répondre

1

La solution que j'ai utilisée qui fonctionne bien est basée sur C) ci-dessus. Je laisse le NSPersistentDocument et son coordinateur de magasin persistant seul, et crée ma propre instance NSPersistentStoreCoordinator que j'utilise exclusivement pour le magasin de bibliothèque persistant (magasin global).

Je peux définir la configuration pour le magasin à une valeur personnalisée dans le cas où je souhaite que plusieurs magasins soient associés ultérieurement à ce coordinateur de magasin persistant (par exemple, "LibraryConfiguration"). Étant donné que le magasin de bibliothèque est géré par un coordinateur de magasin persistant différent du coordinateur de magasin persistant de NSPersistentDocument, je n'ai pas besoin de spécifier une configuration pour les magasins persistants de NSPersistentDocument.

0

Vous devez créer un magasin persistant distinct pour chaque configuration. C'est ce que sont les configurations, pour vous permettre de stocker différentes entités dans le même modèle de données dans des fichiers persistants séparés.

Une erreur courante ici est d'oublier qu'un coordinateur de magasin persistant peut avoir un nombre arbitraire de magasins persistants.Tout ce que vous avez à faire est de dupliquer le passe-partout Apple pour créer deux magasins persistants avec des noms et/ou des emplacements différents et chacun avec un nom de configuration différent. Ajoutez ensuite les deux au coordinateur de magasin persistant.

Et vous avez terminé. Les instances d'entité pour chaque configuration iront dans le bon magasin.

+0

Toutefois, la documentation de NSManagedObjectContext contient uniquement des méthodes permettant d'obtenir/de définir le coordinateur de stockage permanent, sans en ajouter une. C'est-à-dire, à ma connaissance, vous ne pouvez pas avoir plus d'un coordinateur de magasin persistant associé à un contexte d'objet géré. (Le coordinateur de magasin persistant associé à un contexte d'objet géré peut gérer plusieurs banques persistantes, mais c'est différent). – Dalmazio

+0

Désolé, j'ai mal écrit. Vous ajoutez réellement les magasins multiples au coordinateur de magasin persistant avec 'addPersistentStoreWithType: configuration: URL: options: erreur:' – TechZen

+0

D'accord, mais il y a toujours le problème pour cette situation (intégration d'un magasin persistant global et le magasin d'un document basé application) d'appel de addPersistentStoreWithType: ... sur le coordinateur de stockage persistant de NSPersistentDocument comme décrit en A) ci-dessus. – Dalmazio

Questions connexes