2009-08-23 6 views
2

Je voudrais utiliser des objets gérés de données de base en dehors d'un contexte d'objet géré. J'ai vu d'autres sujets sur ce site qui disent que vous ne devriez jamais faire cela, mais voici mon problème:Comment puis-je utiliser des objets de données de base en dehors d'un contexte d'objet géré?

J'ai un objet 'Feed' et un objet 'story'. Le flux est comme un flux RSS et l'histoire ressemble à une seule histoire de ce flux. J'ai la possibilité de mettre en favori des flux, et j'utilise les données de base pour les conserver, mais lorsque je télécharge des articles à partir d'un flux, je ne souhaite pas insérer ces articles dans le contexte d'objet géré. La seule façon de créer mes objets, cependant, est en faisant ceci:

[NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:managedObjectContext]; 

Ce qui signifie qu'il sera persisté à la prochaine enregistrement de l'événement.

Je ne veux pas que ces objets soient conservés jusqu'à ce que l'utilisateur les sélectionne.

J'ai essayé de définir un "TransientStory" et un "PersistentStory" avec un protocole appelé "Story" que les deux implémentent, mais c'est un cauchemar. Des idées?

Répondre

1

Créez un nouveau NSManagedObjectContext avec un stockage en mémoire. Ensuite, vous pouvez mettre vos objets transitoires dans ce contexte, et ils ne seront pas persistés.

NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:[NSBundle mainBundle]]]; // though you can create a model on the fly (i.e. in code) 
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc]  initWithManagedObjectModel:mom]; 

NSError *err; 

// add an in-memory store. At least one persistent store is required 
if([psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:&err] == nil) { 
    NSLog(@"%@",err); 
} 

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init]; 
[moc setPersistentStoreCoordinator:psc]; 

Si vous ne voulez les persister alors, il suffit de les déplacer au magasin approprié après, ou fusionner le contexte.

Sinon, si vous allez éventuellement les mettre dans ce contexte de toute façon (ce que vous ne voulez pas qu'apparaisse les apparaissant dans les listes jusqu'à ce qu'ils soient enregistrés), puis vient de mettre setIncludesPendingChanges-NO dans votre NSFetchRequest.

2

Vous pouvez créer ces objets et tout simplement pas les insérer dans le contexte:

NSEntityDescription *entity = [NSEntityDescription entityForName:entityName 
              inManagedObjectContext:managedContext]; 
ManagedObjectClass *volatileObject = [[ManagedObjectClass alloc] initWithEntity:entity 
               insertIntoManagedObjectContext:nil]; 

Et si vous voulez qu'il vous enregistrez insérez simplement dans le contexte:

[managedContext insertObject:volatileObject]; 

(si vous oubliez de l'ajouter, cela vous donnera une erreur d'objet pendante lorsque vous essaierez de l'enregistrer dans le contexte)

Questions connexes