2014-10-03 77 views
-1

假設我正在構建一個爲特定網站獲取RSS提要的應用程序。用戶可能會要求紐約時報的文章,然後完成並要求從波士頓環球報的文章。將核心數據用於臨時存儲的最佳方式是什麼?

它是有意義的存儲在我的核心數據(糾正我,如果我錯了,因爲我想能夠輕鬆搜索,並與NSFetchedResultsController我可以輕鬆呈現數據。

但是,我該如何處理這樣的事實,即我不想永遠保持身體?在上面的例子中,一旦用戶請求波士頓環球報,我不再需要將數據存儲在紐約時報上,而且當NSFetchedResultsController要求顯示內容並且它仍在商店中時,實際上很煩人。 。

+0

Doug,沒有違法,但這不是一個很好的使用Core Data的方法。我不會建立一個商店,以便在幾次點擊後襬脫它。你說用戶必須能夠搜索,但不想永遠保持。這是否意味着每次用戶退出應用程序時都會刪除數據?請澄清。 – carlodurso 2014-10-03 19:58:49

+0

@carlodurso沒有冒犯,如果這是我想學習的情況!它不需要從應用程序的啓動到啓動,實際上它不應該,從刪除它或操作系統只是清理它。可以在發佈時重新加載Feed以獲取新項目。我很想聽聽你的建議。 – 2014-10-03 20:40:35

+1

太好了。教學和學習,這是我的目標:-)我會發佈一個答案,我想與你分享幾件事情。 – carlodurso 2014-10-03 20:47:40

回答

1

我在使用Core Data進行臨時存儲時看到的一個問題是清理。核心數據不提供API來批量刪除行,例如指定NSPredicate,強制您在刪除行時使用循環。

儘管如此,使用NSFetchedResultsController的便利性可能非常值得刪除時的麻煩:this answer提供了一種以編程方式刪除所有數據的解決方案(其他答案表明刪除底層文件可能無法在最新版本的iOS中使用) 。

如果您不介意編寫一些SQL查詢,而不使用核心數據層,針對「原始」SQLite運行,可能會提供更清晰的替代方案,因爲您可以使用非常簡單的SQL DML命令將刪除卸載到後端存儲上。

+0

「針對」原始「SQLite運行可能會提供一個更清潔的替代方案」。在覈心數據的模式或默認值更改之前,這不能正確處理通知Core Data底層存儲已更改。直接修改Core Data NSSQLiteStoreType存儲的SQLite數據是非常危險的。 – quellish 2014-10-06 00:38:46

+0

@quellish我認爲你完全誤解了我的觀點:我的意思是直接使用SQLite,完全去掉核心數據層。 – dasblinkenlight 2014-10-06 00:55:06

+0

你應該更新你的答案,以明確。最初的問題是關於核心數據,現在你的答案的文本沒有清楚地表明你正在提出一種放棄核心數據方法的方法。 – quellish 2014-10-06 00:56:47

0

如果您不想保存到磁盤,則應該使用內存中存儲選項NSInMemoryStore而不是Sqlite作爲您的NSPersistentStoreCoordinator。

+0

加載新飼料時怎麼樣?舊的Feed信息仍將保留在內存中。 – 2014-10-03 20:41:31

+0

只需刪除商店並創建一個新商店。棘手的部分是確保沒有人使用舊商店。 – 2014-10-03 21:30:25

+0

如果您拆卸並重新創建核心數據堆棧,舊信息將會消失。 – jrturton 2014-10-03 21:37:20

0

在Web開發中使用新詞我不會爲每個用戶會話創建一個SQL表,然後在他/她退出該網站時將其刪除。這對於CPU而言會很昂貴。用這些術語來思考覈心數據。將其用於持久數據。

你的應用程序有些方面不是很清楚,但總的來說我寧願使用NSDictionary來存儲數據。然後,只要觸發搜索,就將這些數據移動到NSArray,該NSArray與NSPredicate很好地協作。

現在,如果您的情況是特定的,並且您認爲Core Data會將性能或UX值添加到您的應用中,那麼您可以在覈心數據中插入對象,並在applicationDidEnterBackgroundapplicationWillTerminate中刪除它們。

[NSEntityDescription insertNewObjectForEntityForName:@"feed" inManagedObjectContext:context]; 
[context deleteObject:aManagedObject]; 

這是我的2美分。

相關問題