2009-08-23 3 views
2

Ich möchte Core Data Managed Objects außerhalb eines verwalteten Objektkontexts verwenden. Ich habe auf dieser Seite andere Threads gesehen, dass Sie sagen, sollte dies nie tun, aber hier ist mein Problem:Wie kann ich Core Data Objects außerhalb eines verwalteten Objektkontextes verwenden?

Ich habe einen ‚Futtermittel‘ Objekt und eine ‚Geschichte‘ Objekt. Feed ist wie ein RSS-Feed und die Geschichte ist wie eine einzige Geschichte aus diesem Feed. Ich habe die Möglichkeit, Feeds mit Lesezeichen zu versehen, und ich verwende Core Data, um diese zu erhalten, aber wenn ich Storys aus einem Feed herunterlade, möchte ich diese Storys nicht in den Kontext des verwalteten Objekts einfügen. Der einzige Weg, um meine Objekte zu erstellen, ist jedoch durch dies zu tun:

[NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:managedObjectContext]; 

Was bedeutet, dass es bei der nächsten Veranstaltung speichern beibehalten wird.

Ich möchte diese Objekte nicht beibehalten, bis der Benutzer sie auswählt.

Ich versuchte, einen „TransientStory“ und eine „PersistentStory“ mit einem Protokoll namens „Story“ definiert, die beide implementieren, aber es ist ein Alptraum. Irgendwelche Ideen?

Antwort

1

Erstellen Sie ein neues NSManagedObjectContext mit einem In-Memory-Speicher. Dann können Sie Ihre transienten Objekte in diesen Kontext einfügen, und sie werden nicht beibehalten.

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]; 

Wenn Sie möchten, haben sie dann bestehen bleiben, so dass sie nur danach auf den richtigen Speicher verschieben, oder den Kontext verschmelzen.

Alternativ, wenn Sie sie schließlich in diesem Zusammenhang ohnehin gehen zu setzen (das heißt Sie wollen einfach nicht in Listen erscheinen, bis sie gespeichert sind) und dann nur setIncludesPendingChanges-NO in Ihrem NSFetchRequest.

2

Sie können diese Objekte erstellen und sie einfach nicht im Kontext einfügen:

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

Und wenn Sie es speichern möchten Sie es nur auf den Kontext einzufügen:

[managedContext insertObject:volatileObject]; 

(wenn Sie Vergessen Sie es nicht hinzuzufügen, es wird Ihnen einen baumelnden Objektfehler geben, wenn Sie versuchen, es in dem Kontext zu speichern)

Verwandte Themen