在保持NSFetchedResultControllerfunction的同时保存单个CoreData实体(不是整个上下文)

唷,对于长头衔感到抱歉。

我有一个单独的托pipe对象上下文,我存储从两个不同的位置派生的歌曲。 我从手机上的永久性存储(使用核心数据)中获得一些歌曲,并从一个在线数据库中提取一些歌曲。 这两首歌都是相同的MananagedObject子类。 我希望这两首歌都在一个上下文中,因为我希望它们都显示在与NSFetchedResultsController连接的表视图上。

当我想保存其中一首歌曲时出现问题。 我不想将所有从在线数据库中提取的歌曲保存到手机中。 我只是想保存单曲,所以一个简单的[moc保存]不起作用。 另一个问题是,我保存单曲后,我仍然希望从网上拉的歌曲是在上下文(但再次,没有保存)。 我相信我有几个不同的select:

1)有可能有NSFetchedResults控制器连接到多个上下文?

2)我可以将从在线数据库中提取的所有歌曲移到单独的临时上下文中,保存在原始上下文中,然后将所有歌曲移回。 (请参阅: 如何将NSManagedObject从一个上下文复制或移动到另一个上下文? )

3)记住在线歌曲的所有键值对,从上下文中删除在线歌曲,保存原始上下文,根据已保存的键值对将所有在线歌曲重新插入原始上下文。

4)我是一个巨大的n00b,我错过了一些更容易。

谢谢!

我认为最简单的做法是将第二个NSPersistentStore连接到持久性存储协调器。 您可以让该商店成为内存商店,并将所有“在线”结果存储在该(临时)商店中。 您可以使用assignObject:toPersistentStore:指定应该将新插入的对象保存在哪个存储中。 一旦你这样做,你可以自由地保存,因为“保存”将只发生在你的在线歌曲的内存。

然后,当你想将一首歌曲从在线设置中移动到永久设置时,只需删除它并重新插入,用相同的方法将新对象分配到永久持久存储中。

这将允许您使用附加到您的NSPersistentStoreCoordinator的单个NSManagedObjectContext ,它将看到来自两个NSPersistentStore的对象。

杰西的解决scheme将工作得很好。

然而,作为另一种select,您可以简单地使用嵌套的上下文,就像您对详细的检查器。

该上下文可以容纳所有“临时”项目,但由于它是“保存”上下文的子项,所有提取都可以正常工作。

 NSManagedContext *tempContext = [[NSManagedContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; tempContext.parentContext = mainManagedObjectContext; 

ALl您的保存将被插入mainManagedObjectContext,并保存:。 所有的临时项目将进入tempContext。

将你抓取的结果控制器也附加到tempContext中。

当你准备摆脱临时项目,只需将tempContext设置为零。