Core data 如何在托管对象上下文之外使用核心数据对象?

Core data 如何在托管对象上下文之外使用核心数据对象?,core-data,Core Data,我希望在托管对象上下文之外使用核心数据托管对象。我在这个网站上看到其他帖子说你永远不应该这样做,但我的问题是: 我有一个“提要”对象和一个“故事”对象。提要类似于RSS提要,而故事类似于该提要中的单个故事。我有能力为提要添加书签,并且我使用核心数据来持久化这些提要,但是当我从提要下载故事时,我不想将这些故事插入到托管对象上下文中。但是,创建我的对象的唯一方法是: [NSEntityDescription insertNewObjectForEntityForName:name inManaged

我希望在托管对象上下文之外使用核心数据托管对象。我在这个网站上看到其他帖子说你永远不应该这样做,但我的问题是:

我有一个“提要”对象和一个“故事”对象。提要类似于RSS提要,而故事类似于该提要中的单个故事。我有能力为提要添加书签,并且我使用核心数据来持久化这些提要,但是当我从提要下载故事时,我不想将这些故事插入到托管对象上下文中。但是,创建我的对象的唯一方法是:

[NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:managedObjectContext];
这意味着它将在下一次保存事件中持久化

我不希望这些对象在用户选择它们之前被持久化


我试图用一个称为“Story”的协议来定义“TransientStory”和“PersistentStory”,这两个协议都实现了,但这是一场噩梦。有什么想法吗?

使用内存存储创建一个新的
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];
如果您确实想保存它们,只需在之后将它们移动到适当的存储区,或者合并上下文即可


或者,如果您最终还是要将它们放入该上下文中(即,在保存它们之前,您不希望它们出现在列表中),则只需在
NSFetchRequest
中将
setIncludesPendingChanges
设置为
NO
,您就可以创建这些对象,而不必在上下文中插入它们:

NSEntityDescription *entity = [NSEntityDescription entityForName:entityName
                                          inManagedObjectContext:managedContext];
ManagedObjectClass *volatileObject = [[ManagedObjectClass alloc] initWithEntity:entity
                                                 insertIntoManagedObjectContext:nil];
[managedContext insertObject:volatileObject];
如果要保存,只需将其插入上下文:

NSEntityDescription *entity = [NSEntityDescription entityForName:entityName
                                          inManagedObjectContext:managedContext];
ManagedObjectClass *volatileObject = [[ManagedObjectClass alloc] initWithEntity:entity
                                                 insertIntoManagedObjectContext:nil];
[managedContext insertObject:volatileObject];
(如果您忘记添加它,当您尝试在上下文中保存它时,它将给您一个悬空对象错误)