如何在托管对象上下文之外使用核心数据对象?
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@.
【讨论】:
以上是关于如何在托管对象上下文之外使用核心数据对象?的主要内容,如果未能解决你的问题,请参考以下文章