2011-07-17 182 views
0

我目前正在使用CoreData持久保存某些對象的iPhone應用程序。具有與CoreData相同類型的持久性和非持久性對象

爲了使我的觀點清楚,我想給你一個簡短的介紹到的情景:

我有一些數據,我從網上查詢。我將這些數據保存在一個名爲MyData的對象中,並在需要的地方使用它。當使用數據時,我想持久保存它,以便將其保存到MyManagedData對象。

我真的不喜歡這種保存數據的解決方案。因爲我有兩個類保存完全相同的數據,但其中一個由CoreData管理。

有沒有辦法實例化管理對象而不自動將它們保存到CoreData?所以我可以只有MyManagedData對象並保存一堆呢?你如何構建這樣的事情?

問候

回答

2

一種可行的方法是擁有兩個託管對象上下文。您已經爲主要持久數據使用了上下文,因此您可以爲您永遠不會保存的「臨時」數據創建新的上下文。

這裏有一些關於這個主題的文章,比如http://www.timisted.net/blog/archive/multiple-managed-object-contexts-with-core-data/

我一直在使用InnerBand來幫助CoreData。它簡化了我的代碼,而且不會妨礙我的工作。

如果使用InnerBand,用於存儲瞬態實體(未保存)創建臨時的上下文/存儲應該只是做了以下的情況:

// note - not calling [CoreDataStore mainStore] here -- 
// we use that for persisted main data 
self.temporaryStore = [CoreDataStore createStore]; 

// and then create temporary entities like so: 
MyEntityClass *myEntity = [MyEntity createInStore:self.temporaryStore]; 

很顯然,你永遠不應該叫[self.temporaryStore save],因爲它僅用於瞬態數據。

注意:我還沒有嘗試過上述策略,但我相信它是可行的。

N.B.在一個相關的問題上,我也使用mogenerator,它可以消除生成實體類的麻煩(並且可以防止重新生成實體類時可能添加到實體類中的自定義代碼的破壞)。

0

最簡單的解決方法是刪除你不再需要保存上下文之前的管理對象。這樣,上下文將只將要保留的對象寫入持久性存儲。

但是,我不打擾。我只想告訴上下文在不再需要時刪除對象,而不用擔心它們是否在任何特定時間寫入磁盤。如果你的數據太少,你可以一次把所有的數據保存在內存中,那麼將這些對象寫入磁盤以便稍後刪除它們的開銷將很小。

+0

Thx。但是,如果我不需要處理的話,爲每個將被保存的對象設置一個NSMangedObject有時會涉及太多的我不想處理的代碼。 – Kie

+0

與跟蹤兩組不同對象的開銷相比,不是這樣,有些則保存,有些則沒有。根據您的姓名和您對Core Data使用的描述,我認爲您沒有正確使用它。我認爲你爲了節省時間和精力而浪費時間和精力進行錯誤的嘗試。 – TechZen

+0

這也許是一個好點。我有我的系統中的對象的一些類,我從對象作爲參數或返回值傳遞給對象。我必須創建這個對象使用它們並在某些情況下釋放它們,在另一種情況下,我需要這些對象(或它們包含的數據)並保存它們。 最好的辦法可能是爲這個對象數據保存一個容器嗎?或者這是一個錯誤的用途? 如果我自己寫一個SQLite包裝器,我會實現一個裝載器類,它給了我這樣一個對象中某些數據庫條目的數據。 – Kie