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

riz*_*zes 9 core-data nsfetchedresultscontroller nsmanagedobject nsmanagedobjectcontext ios

哎呀,对不起这么长的头衔.

我有一个托管对象上下文,我存储从两个不同位置派生的歌曲.我从手机上的持久存储中获取了一些歌曲(使用Core Data),我从在线数据库中提取了一些歌曲.这两首歌都属于同一个MananagedObject子类.我想这两个歌曲是在一个单一的情况下,因为我想他们两个出现在与NSFetchedResultsController连接的表视图.

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

1)是否可以将NSFetchedResults控制器连接到多个上下文?

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

3)记住在线歌曲的所有键值对,从上下文中删除在线歌曲,保存原始上下文,根据保存的键值对将所有在线歌曲插回到原始上下文中.

4)我是一个巨大的n00b,我更容易丢失一些东西.

谢谢!

Jes*_*sak 8

我认为最简单的方法是将第二个NSPersistentStore附加到持久性商店协调员.您可以将该商店作为内存存储,并将所有"在线"结果存储在该(临时)商店中.您可以指定应将新插入的对象保存在哪个商店中assignObject:toPersistentStore:.一旦你完成了这个,你可以自由地保存,因为"保存"只会发生在你的在线歌曲的内存中.

然后,当您想将一首歌从在线集移动到永久集时,只需将其删除并重新插入即可,使用相同的方法将新对象分配给永久持久存储.

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


Jod*_*ins 5

Jesse的解决方案可以正常工作.

但是,作为另一种选择,您可以简单地使用嵌套上下文,就像您对详细检查器一样.

该上下文可以保存所有"临时"项目,但由于它是您"保存"上下文的子项,所有提取都可以正常工作.

NSManagedContext *tempContext = [[NSManagedContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
tempContext.parentContext = mainManagedObjectContext;
Run Code Online (Sandbox Code Playgroud)

您的保存将被插入到mainManagedObjectContext中,并使用save:保存.所有临时项目都将进入tempContext.

将获取的结果控制器也附加到tempContext.

当您准备摆脱临时项目时,只需将tempContext设置为nil即可.