2012-11-08 25 views
0

我使用CoreData存儲下面的類:如何在CoreData中對鍵/值對進行建模?

@interface TripSegment : NSManagedObject 

@property (nonatomic, retain) NSString * details; 
@property (nonatomic, retain) NSDate * endsOn; 
@property (nonatomic, retain) NSString * segmentCategory; 
@property (nonatomic, retain) NSDate * startsOn; 
@property (nonatomic, retain) NSString * title; 
@property (nonatomic, retain) NSString * tripSegmentId; 
@property (nonatomic, retain) ContextCard *contextCard; 
@property (nonatomic, retain) Location *endsAt; 
@property (nonatomic, retain) Location *startsAt; 
@property (nonatomic, retain) Trip *trip; 

@end 

對於一些TripSegments,(航班,例如),我有一些額外的數據回來,像確認號或座位分配。我想以靈活的方式存儲這些數據,因此當我發現更多有用的內容呈現在UI中時,我可以將其包含在服務中並開始使用它,而無需遷移模型或處理複雜的類層次結構。

如何將鍵/值添加到持久存儲在CoreData存儲中的對象?或者,我是否必須制定具體的課程來代表航班或酒店住宿,並將這些單獨持有關係?

回答

1

正如我所見,您有幾個選擇。

  1. 你可以一個二進制數據屬性添加到您的TripSegment類,並使用NSKeyedArchiver轉換一個NSDictionary存儲額外的屬性,並從NSData
  2. 你可以實現自己的通用鍵/值對核心數據對象,並且在你的TripSegment和該類別之間有一對多的關係。
  3. 您可以使用NSJSONSerialization將額外的數據轉換爲JSON或從JSON轉換出來,並將其作爲String屬性存儲在TripSegment類中。

我認爲這取決於您想如何使用額外的數據。如果您需要能夠獨立於TripSegment查詢屬性(例如,獲取已分配的所有席位分配),那麼擁有單獨的鍵/值樣式類可能是最好的。如果您需要CD數據來存儲二進制信息作爲收到的額外信息的一部分,那麼可能JSON序列化將不是最好的選擇,因爲數據大小可能會因base64轉換而失效。

+0

1)不良的清潔 - 我們做到了/做到這一點和它吮吸:)但比3 IMO更好。我會去2如果你真的需要在運行時添加自定義屬性 - 我不認爲 –

+0

+1,謝謝你的選擇是真棒。使用選項2,因爲我可以在服務器上建模一個匹配的類,並避免混淆Restkit/CoreData集成。 –

0

正如我在@ rickerbh的回答指出,我會跟選項#2去,如果你確實需要在運行時添加自定義屬性 - 這我不認爲你需要

我明白你只是想沒有遷移 以及...只要讓你的媽媽成爲媽媽和版本它。只要你只需要添加或重命名屬性模型,coredata可以透明地遷移=>沒有爲你工作:)

這是IMO

+0

我現在正在嘗試CoreData Migration,而輕量級遷移雖然可以像您說的那樣工作,但很難跟蹤哪些修改符合「輕量級」的要求,而錯誤的移動可能意味着應用程序會崩潰。我還必須做一些體操獲得RestKit來處理版本模型。 –

+0

新的屬性計數;)它是真正高性能的唯一方法 –

相關問題