9

呸,抱歉标题太长了。

我有一个托管对象上下文,我在其中存储来自两个不同位置的歌曲。我从手机上的持久存储中获取一些歌曲(使用 Core Data),然后从在线数据库中提取一些歌曲。两首歌曲都属于同一个 ManagedObject 子类。我希望这两首歌都在一个上下文中,因为我希望它们都显示在与 NSFetchedResultsController 连接的表格视图中。

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

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

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

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

4)我是一个巨大的n00b,并且缺少一些更容易的东西。

谢谢!

4

2 回答 2

8

I think the easiest thing to do would be to have a second NSPersistentStore attached to your persistent store coordinator. You can have that store be an in-memory store, and store all your "online" results in that (temporary) store. You can specify which store a newly-inserted object should be saved in with assignObject:toPersistentStore:. Once you've done this, you can save freely, since the "save" will only happen to memory for your online songs.

Then, when you want to move a song from the online set to the permanent set, just delete it and re-insert it, assigning the new object to your permanent persistent store with the same method.

This will let you use a single NSManagedObjectContext attached to your NSPersistentStoreCoordinator, which will see objects from both of the NSPersistentStores.

于 2012-08-08T00:56:12.787 回答
5

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

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

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

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

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

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

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

于 2012-08-08T02:28:30.820 回答