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

Posted

技术标签:

【中文标题】如何在托管对象上下文之外使用核心数据对象?【英文标题】:How can I use Core Data Objects outside of a managed object context? 【发布时间】:2009-08-23 18:15:17 【问题描述】:

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

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

[NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:managedObjectContext];

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

我不希望这些对象在用户选择它们之前一直保留。

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

【问题讨论】:

【参考方案1】:

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

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

如果你想保存它,你只需将它插入到上下文中:

[managedContext insertObject:volatileObject];

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

【讨论】:

【参考方案2】:

使用内存存储创建一个新的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 设置为 NO 987654325@.

【讨论】:

以上是关于如何在托管对象上下文之外使用核心数据对象?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据获取...为啥在将托管对象插入上下文 A 并保存上下文 A 后,不使用上下文 B 获取托管对象?

核心数据和托管对象上下文

撤消核心数据托管对象

核心数据:托管对象与上下文一起保存后如何撤消操作

核心数据:父/子托管对象上下文是不是适合更新一组多个对象?

初始化托管对象而不插入托管对象上下文时,核心数据对象属性为零