我有一个托管对象上下文,我存储从两个不同位置派生的歌曲。我从手机上的持久存储中获取了一些歌曲(使用Core Data),我从在线数据库中提取了一些歌曲。这两首歌都属于同一个MananagedObject子类。我希望这两首歌都在一个上下文中,因为我希望它们都能显示在与NSFetchedResultsController连接的表视图上。
当我想保存其中一首歌时会出现问题。我不想将从在线数据库中提取的所有歌曲保存到手机中。我只想保存单曲,所以简单的[moc save]不起作用。另一个问题是,在我保存单曲之后,我仍然希望从在线播放的歌曲在上下文中(但是再次,不保存)。我相信我有几个不同的选择:
1)是否可以将NSFetchedResults控制器连接到多个上下文?
2)我可以将从在线数据库中提取的所有歌曲移动到单独的临时上下文中,保存在原始上下文中,然后将所有歌曲移回。 (见:How do I copy or move an NSManagedObject from one context to another?)
3)记住在线歌曲的所有键值对,从上下文中删除在线歌曲,保存原始上下文,根据保存的键值将所有在线歌曲插回到原始上下文中对
4)我是一个巨大的n00b,我更容易丢失一些东西。
谢谢!
答案 0 :(得分:8)
我认为最简单的方法是将第二个NSPersistentStore
附加到持久性商店协调员。您可以将该商店作为内存存储,并将所有“在线”结果存储在该(临时)商店中。您可以使用assignObject:toPersistentStore:
指定应将新插入的对象保存到哪个商店。一旦你完成了这个,你可以自由地保存,因为“保存”只会发生在你的在线歌曲的内存中。
然后,当您想将一首歌从在线设置移动到永久设置时,只需将其删除并重新插入即可,使用相同的方法将新对象分配给永久持久性存储。
这将允许您使用附加到NSManagedObjectContext
的{{1}}个NSPersistentStoreCoordinator
,它会看到来自NSPersistentStore
的两个对象。
答案 1 :(得分:5)
Jesse的解决方案可以正常使用。
但是,作为另一种选择,您可以简单地使用嵌套上下文,就像使用详细检查器一样。
该上下文可以保存所有“临时”项目,但由于它是“保存”上下文的子项,所有提取都可以正常工作。
NSManagedContext *tempContext = [[NSManagedContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
tempContext.parentContext = mainManagedObjectContext;
ALl您的保存将被插入到mainManagedObjectContext中,并使用save:保存。所有临时项目都将进入tempContext。
将获取的结果控制器附加到tempContext。
当您准备摆脱临时项目时,只需将tempContext设置为nil。