如何在托管对象上下文之外使用Core Data Objects?

时间:2009-08-23 18:15:18

标签: core-data

我想在托管对象上下文之外使用Core Data托管对象。我在网站上看过其他线索,说你永远不应该这样做,但这是我的问题:

我有一个'Feed'对象和一个'story'对象。 Feed就像一个RSS提要,故事就像是来自该提要的单个故事。我有能力为feed添加书签,我使用Core Data来保存这些,但是当我从feed下载故事时,我不想将这些故事插入到托管对象上下文中。但是,创建对象的唯一方法是:

[NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:managedObjectContext];

这意味着它将在下一次保存事件中保留。

我不希望这些对象在用户选择之前保持不变。

我尝试用一​​个叫做“故事”的协议定义一个“TransientStory”和一个“PersistentStory”,它们都实现了,但这是一场噩梦。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以创建这些对象,而不是在上下文中插入它们:

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

如果您想保存它,只需将其插入上下文:

[managedContext insertObject:volatileObject];

(如果您忘记添加它,当您尝试将其保存在上下文中时,它会给您一个悬空对象错误)

答案 1 :(得分:1)

使用内存存储创建新的NSManagedObjectContext。然后你可以把你的瞬态对象放到这个上下文中,它们将不会被持久化。

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

如果您确实希望继续使用它们,请稍后将其移至正确的商店,或合并上下文。

或者,如果您最终还是要将它们放入该上下文中(例如,您只是不希望它们出现在列表中,直到它们被保存),那么只需将setIncludesPendingChanges设置为NONSFetchRequest