9

唉,对于长标题感到抱歉。在保存NSFetchedResultController功能的同时保存单个CoreData实体(不是全部上下文)

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

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

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

2)我可以将从在线数据库中提取的所有歌曲移到单独的临时上下文中,保存在原始上下文中,然后将所有歌曲移回。 (请参阅:How do I copy or move an NSManagedObject from one context to another?

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

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

谢谢!

+0

你实际上想要保存什么?歌曲的位置或实际歌曲数据(文件)? – sosborn 2012-08-08 00:35:29

回答

8

我认为最简单的做法是将第二个NSPersistentStore附加到您的持久性商店协调员。您可以让该商店成为内存商店,并将所有“在线”结果存储在该(临时)商店中。您可以使用assignObject:toPersistentStore:指定应将新插入的对象保存在哪个存储中。完成此操作后,您可以自由保存,因为“保存”只会发生在您的在线歌曲的内存中。

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

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

+0

Apple推广使用多个持久性商店来进行类似的场景(如应用程序附带的初始数据)。我会说,无论何时你有永久存储计划不同的实体,这都是一个好主意。 – rickster 2012-08-08 04:57:05

+0

很棒的回答。猜猜我的问题的答案是选项#4 ... – rizzes 2012-08-08 16:53:11

+1

小心如果您要维护使用不同持久存储的实体之间的关系。根据我们在苹果公司的朋友的说法:“您必须小心,不要从一个持久存储中的实例到另一个持久存储中的实例创建关系,因为Core Data不支持这种关系。如果您需要在不同存储中的实体之间创建关系,您通常使用提取的属性“https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW5 – NSTJ 2015-01-23 11:30:06

5

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

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

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

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

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

将您获取的结果控制器也附加到tempContext中。

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

相关问题