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設置爲零即可。

相關問題