保存单CoreData实体(而不是整个上下文),同时保持NSFetchedResultControl

2019-07-30 20:04发布

唷,遗憾的长标题。

我有一个单一的管理对象上下文我在哪里存储从两个不同的位置得到的歌曲。 我得到的一些歌曲从手机上的持久性存储(使用核心数据),和我拉的一些歌曲从在线数据库。 无论是歌曲都是相同MananagedObject子类。 我想这两个歌曲是在一个单一的情况下,因为我想他们两个出现在与NSFetchedResultsController连接的表视图。

出现该问题时,我想保存的歌曲之一。 我不希望保存所有我从在线数据库中的电话拉的歌曲。 我只是想救单曲,所以一个简单的[MOC保存]不起作用。 另一个问题是,经过我保存单首歌曲,我还是想从网上拉歌是在上下文(但同样,不保存)。 我相信,我有几个不同的选择:

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

2)我可以把所有从在线数据库中抽取到一个单独的临时的上下文的歌曲,保存在原范围内,然后将所有的歌曲了。 (参见: 如何复制或从一个上下文移到一个NSManagedObject到另一个? )

3)记住所有的在线听歌的键值对的,从上下文中删除网上的歌曲,保存原来的背景下,插入所有的在线听歌回基于关闭保存键值对的原始环境。

4)我是一个巨大的n00b和我失去了一些东西更容易。

谢谢!

Answer 1:

我认为最简单的事情将有第二NSPersistentStore连接到你的持久存储协调。 你可以有一个店是在内存中存储和存储在(临时)存储您的所有“在线”的结果。 您可以指定存储新插入的对象应该保存在assignObject:toPersistentStore: 一旦你做到了这一点,你可以自由地保存,因为“保存”只会发生在内存为您的网上歌曲。

然后,当你想从网上订的移动的歌曲到永久,删除它,然后重新插入,用同样的方法分配新的对象,以你的永久持久性存储。

这将让你使用一个单一NSManagedObjectContext连接到您的NSPersistentStoreCoordinator ,这将看到两者的对象NSPersistentStore秒。



Answer 2:

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

然而,作为另一种选择,你可以简单地使用嵌套的情况下,就像你会进行了详细的检查。

这种情况下可以容纳你所有的“临时”的项目,但因为它是你的“节能”方面的一个孩子,所有的取指将工作得很好。

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

所有的节省会被插入到mainManagedObjectContext,并保存与保存:。 您所有的临时项目将进入tempContext。

请附上您的读取的结果控制到tempContext为好。

当您准备好摆脱暂时的物品,只需设置tempContext为零。



文章来源: Saving Single CoreData Entity (Not the Whole Context) While Keeping NSFetchedResultController Functionality