在保持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设置为零。