Comment Traiter Temporaire NSManagedObject instances?
J'ai besoin de créer NSManagedObject
cas, faire des trucs avec eux et puis poubelle ou de les stocker à sqlite db. Le problème est que je ne peut pas créer des instances de NSManagedObject
étrangers à NSManagedObjectContext
et cela signifie que je dois éclaircir quelque peu après je décide que je n'ai pas besoin de certains objets dans ma db.
À traiter avec elle, j'ai créé une banque de mémoire à l'aide de la même coordonnateur et je suis plaçant temporairement des objets en utilisant assignObject:toPersistentStore.
Maintenant, comment puis-je m'assurer que ces objets temporaires ne pas obtenir les données, dont j'extrais de la commune pour les deux magasins contexte? Ou dois-je créer des contextes différents pour une telle tâche?
UPD:
Maintenant je vais penser à faire autre contexte pour la mémoire vive. Comment puis-je déplacer des objets à partir d'un contexte à l'autre? Juste à l'aide de [contexte insertObject:]? Il travaillera sur OK dans cette configuration? Si j'insère un objet à partir du graphe d'objets, le graphique permet aussi de s'insérés dans leur contexte?
- Cela devrait être une question distincte puisque vous avez marqué ce un comme réponse. Créer une nouvelle question et d'expliquer POURQUOI vous vous sentez vous avez besoin d'un ensemble de Données de Base de la pile UNIQUEMENT pour une banque de mémoire. Je serai heureux d'examiner la question avec vous.
- UPD article est pas pertinente, parce que j'en ai choisi une autre approche, voir mon dernier commentaire à votre réponse.
Vous devez vous connecter pour publier un commentaire.
REMARQUE: Cette réponse est très vieux. Voir les commentaires pour l'histoire complète. Ma recommandation a changé depuis et je n'ai plus de recommander l'utilisation d'indépendance
NSManagedObject
instances. Ma recommandation actuelle est à l'utilisation temporaire de l'enfantNSManagedObjectContext
instances.Réponse Originale À Cette Question
La façon la plus simple de le faire est de créer votre
NSManagedObject
des cas, sans associé à unNSManagedObjectContext
.Puis, quand vous voulez l'enregistrer:
NSManagedObject
instances sans contexte. Je ne fais plus que le paysage a radicalement changé depuis. La création d'un contexte n'est plus cher, associant unNSManagedObject
avec un contexte est plus cher. Les conseils des changements que l'Api de changement. Si vous utilisez la Base de Données n'est jamais une raison pour créer des objets de transfert de données.iOS5 offre une solution plus simple Mike Weller réponse. Au lieu d'utiliser un enfant NSManagedObjectContext. Il supprime la nécessité de trampoline par NSNotificationCenter
Pour créer un enfant contexte:
Ensuite créer vos objets à l'aide de l'enfant contexte:
Les modifications ne sont appliquées que lorsque l'enfant contexte est enregistré. Donc, pour enregistrer les modifications, il suffit de ne pas enregistrer.
Il y a toujours une limitation sur les relations. c'est à dire Vous ne pouvez pas créer des relations aux objets dans d'autres contextes. Pour contourner cette utilisation objectID, pour obtenir l'objet de l'enfant contexte. par exemple.
Remarque, l'économie de l'enfant contexte applique les modifications pour le contexte parent. En enregistrant le contexte parent persiste les modifications.
Voir wwdc 2012 session 214 pour une explication complète.
moc
dans le troisième extrait? Est-ilchildContext
oumyMangedObjectContext
?NSManagedObject
déjà fournit l'NSManagedObjectContext
, vous pouvez automatiser le choix de contexte:NSManagedObject* objectRelatedContextually = [objectWithRelationship.managedObjectContext objectWithID:objectRelated.objectID];
et puisobjectWithRelationship.relationship = objectRelatedContextually;
.La bonne façon d'atteindre ce genre de chose est un objet géré contexte. Vous créez un objet géré avec la même persistance:
Puis vous ajoutez de nouveaux objets, de muter, etc.
Quand vient le temps de l'enregistrer, vous avez besoin de les appeler [tempContext enregistrer:...] sur le tempContext, et la poignée de la notification d'enregistrement de fusionner dans votre contexte d'origine. À jeter les objets, il suffit de relâcher ce contexte temporaire et de l'oublier.
Sorte que lorsque vous enregistrez le contexte temporaire, les modifications sont conservées dans le magasin et vous avez juste besoin d'obtenir ces modifications dans votre contexte principal:
C'est aussi la façon dont vous devez gérer le multi-thread de base de données. Un contexte par thread.
Si vous avez besoin d'accéder à des objets existants à partir de ce contexte temporaire (pour ajouter des relations, etc.) ensuite, vous devez utiliser l'IDENTIFIANT d'objet pour obtenir une nouvelle instance comme ceci:
Si vous essayez d'utiliser un
NSManagedObject
dans le mauvais contexte, vous obtiendrez des exceptions lors de l'enregistrement.NSManagedObjectContext
est coûteux en mémoire et PROCESSEUR. J'ai réalisé que c'était à l'origine de certains des Apple des exemples, mais ils ont mis à jour et corrigé de ces exemples.La création d'objets temporaires de nil contexte fonctionne très bien jusqu'à ce que vous avez réellement essayez d'avoir une relation avec un objet dont le contexte != nul!
assurez-vous que votre accord avec ça.
Ce que vous décrivez est exactement ce qu'un
NSManagedObjectContext
est pour.De Base De Données Guide De Programmation: Les Bases De Données
Et Base De Données Guide De Programmation: Objet Géré De Validation
NSManagedObjectContext
s sont conçus pour être léger. Vous pouvez créer et jetez-les à volonté - c'est la persistance de magasins de coordinateur et de dépendances qui sont "lourds". Un seul magasin persistant coordonnateur peut avoir de nombreux contextes associés. En vertu de l'ancien fil de confinement modèle, cela signifierait fixer le même magasin persistant coordonnateur de chaque contexte. Aujourd'hui, il signifierait la connexion imbriqués les contextes d'une racine de contexte associé à la persistance de coordonnateur du magasin.De créer un contexte, de créer et de modifier des objets gérés dans ce contexte. Si vous souhaitez les conserver et de communiquer ces modifications, enregistrez le contexte. Sinon l'éliminer.
D'essayer de créer des objets gérés indépendamment d'un
NSManagedObjectContext
est d'avoir des ennuis. Rappelez-vous que la Base de Données est en fin de compte un changement de mécanisme de suivi pour un objet graphique. De ce fait, les objets gérés sont vraiment une partie de l'objet géré contexte. Le contexte observe leur cycle de vie, et sans le contexte pas tous de l'objet géré fonctionnalité fonctionne correctement.En fonction de votre utilisation de l'objet temporaire il y a quelques mises en garde pour les recommandations ci-dessus. Mon cas est que je veux créer un objet temporaire et le lier à vue. Lorsque l'utilisateur choisit d'enregistrer cet objet, je veux la configuration des relations d'objet existant(s) et de les enregistrer. Je veux le faire pour éviter la création d'un objet temporaire pour stocker ces valeurs. (Oui, je pourrais juste attendre jusqu'à ce que l'utilisateur enregistre et puis saisir le point de vue du contenu, mais je suis en train de mettre ces points de vue à l'intérieur d'un tableau et de la logique pour ce faire est moins élégant.)
Les options pour les objets temporaires sont:
1) (de préférence) Créer un objet temporaire dans un contexte enfant.
Cela ne marchera pas, parce que je suis de liaison de l'objet à l'INTERFACE utilisateur et je ne peux pas garantir que l'objet accesseurs sont appelés sur l'enfant contexte. (Je n'ai trouvé aucune documentation qui indique le contraire donc, je suppose.)
2) Créer un objet temporaire à néant contexte de l'objet.
Cela ne fonctionne pas et les résultats en perte de données ou à la corruption.
Ma Solution:
J'ai résolu ce problème par la création de l'objet temporaire à néant contexte de l'objet, mais lorsque je sauvegarde l'objet, plutôt que de l'insérer en tant que n ° 2, je copie tous ses attributs dans un nouvel objet que je crée dans le contexte principal. J'ai créé un appui de la méthode dans mon NSManagedObject sous-classe appelée cloneInto: qui me permet de copier les attributs et les relations facilement pour n'importe quel objet.
Pour moi Marcus réponse n'a pas fonctionné. Voici ce qui a fonctionné pour moi:
puis, si je décide de l'enregistrer:
Il ne faut pas oublier de libérer
Je suis à réécrire cette réponse pour Swift comme tous les mêmes questions pour swift rediriger à cette question.
Vous pouvez déclarer l'objet sans ManagedContext en utilisant le code suivant.
Plus tard, à économiser de l'objet, vous pouvez l'insérer dans le contexte et l'enregistrer.