2012-07-05 69 views
2

在過去的幾天裏,我一直在嘗試使用Core Data爲遊戲構建一個簡單的加載/保存系統。要麼我完全錯過了一些東西(閱讀:我是盲人和/或愚蠢的)或者核心數據並不是爲我想要做的。解決方案:使用CoreData保存/加載遊戲系統

保存,加載和創建我的UIManagedDocument工作正常。在我的savegame實體中設置和加載屬性的值也可以正常工作。

問題是,當我的應用程序退出時,這些值會丟失,因爲我不知道如何訪問它們。

我的存儲遊戲實體內部有大約200個屬性,例如(NSNumber *)currentIncome,NSNumber *currentMoney, NSNumber *currentMonth等。似乎很簡單,對嗎?如果我將這些分成具有關係的屬性,我最終可能會有大約20個屬性。從我從「核心數據編程指南」中收集的內容中,爲了使用保存的UIManagedDocument中的值填充實體,我需要執行fetchrequest,其中包含填充結果數組的謂詞。

這是我第一個問題出現的地方:我需要爲每個屬性執行fetchrequest嗎?如果你只有幾個屬性或者如果你有'多'關係,這似乎很有用。就我而言,這似乎令人難以置信的乏味,但。

我可能會錯過這裏非常重要的東西,但我需要類似load my UIManagedDocument and automatically fill my NSManagedModel with the one that was saved in the document's context之類的東西,但找不到它。

這就是我的第二個問題:CoreData和UIManagedDocument甚至是正確的方法嗎? 200個變量對於NSUserDefaults來說太多了 - 我可以想象使用NSCoding。我肯定希望在以後的日子裏整合iCloud savegame共享,而UIManagedDocument和CoreData對於這一點來說似乎是完美的。編輯: 原來我是盲人和/或愚蠢的。我只是重寫了整個核心數據獲取代碼(20行下降到10左右)。 爲沒有謂詞的實體執行fetchrequest顯然會返回整個實體。 如果我的(NSArray *) fetchedResults結果爲零(數據庫爲空),我插入我的savegame實體的新實例在我的managedobjectcontext。 如果它變成非零,我只是做一個(NSManagedObject *)saveGame = [fetchedResults lastObject]和每個值得到加載罰款。

如果有人有興趣,我會在今天晚些時候發佈整個代碼。

回答

0

從數據庫的角度來看,這聽起來像你在這裏的是一個數據庫與一個表saveGame與200列currentMoney, currentMonth,等等。然後,你的數據庫中有一行代表當前的遊戲狀態。

NSFetchRequest是數據庫SELECT聲明等價的,因爲你只有一排,你真的不需要任何謂詞WHERE條款等,只是讓一切從該表中,這是你取的請求,只有指定該實體正在做SELECT * FROM saveGame

所以總而言之,聽起來你並沒有從這裏的核心數據框架中獲得更多價值。另一種選擇可能是查看iCloud Key-Value storage API,這聽起來更接近你當前從核心數據獲得的內容。