2010-08-16 54 views
6

我必須將自定義類對象存儲到Coredata。問題是我的自定義類包含結構,枚舉等。我嘗試了下面的方法。如何在Coredata中存儲帶結構的自定義對象

- (void)encodeWithCoder:(NSCoder *)編碼器。

,但我得到這個錯誤

[的NSKeyedArchiver encodeValueOfObjCType:在:]:此歸檔無法編碼結構

什麼是這個對象存儲Coredata的最佳實踐。請幫幫我。

回答

6

你可以用在NSData的結構,即

要使用歸檔編碼

[coder encodeObject:[NSData dataWithBytes:&my_struct length:sizeof(my_struct)] 
      forKey:@"my_struct"]; 

與歸檔解碼

NSData *data = [coder decodeObjectForKey:@"my_struct"]; 
[data getBytes:&my_struct length:sizeof(my_struct)]; 
+0

使用dataWithBytes:length:在不同的endian或32/64位平臺之間不可移植。使用這將導致老數據卡住給定設備,用戶將無法升級到不同的平臺,或者在不同於創建它的平臺上傳輸/打開文件。 – 2010-08-17 04:05:00

+0

@Brent當然......但問題是關於iPhone,我認爲這應該在幾年內運行良好......如果蘋果公司將改變硬件我相信(一)他們將有一段時間使用模擬器來帶來儘可能多的軟件(b)程序將不得不重新編譯並且可以在那時(如果需要的話)進行修復......並且這僅僅是創建/存儲在一種類型的硬件上的「數據」的問題,這是轉移到一個新的不同的架構... – epatel 2010-08-17 05:32:37

+0

@epatel我有客戶在PPC和英特爾傳輸CoreData備份文件到/從iPhone。如果我聽了這個建議,會讓我頭痛。您可以爲iPhone構建ARM 6/7代碼,將來不會考慮32/64位胖二進制文件。這是一個「小心」的評論,我推薦下面提到的NSCoder方法,它永遠是安全的,不僅僅是在短期內「幾年」。 – 2010-08-18 19:13:53

1

對於一個struct,我認爲最好是創建一個可以對結構進行編碼和解碼的函數,就像任何Objective-C對象一樣。

有了枚舉,我不太確定。枚舉只是與名字相關的數字,所以只需編碼並將它們解碼爲數字。

4

你應該有NSCoding的自定義實現協議在您的自定義類中。在你自己的實現-[initWithCoder:]-[encodeWithCoder:]中,你可以用任何你喜歡的方式對結構對象進行編碼/解碼。

在途中要做的是撥打電話[coder encodeObject:[NSValue valueWithBytes:&yourStructVariable objCType:@encode(struct YourStructName)] forKey:@"someKey"];-[encodeWithCoder:]並在-[initWithCoder:]做相應的解碼。

然後,您可以將類對象存儲爲可轉換的核心數據。

+1

使用NSValue valueWithBytes是拋出OP提到的異常。 – 2013-07-31 18:31:08

相關問題