我必須將自定義類對象存儲到Coredata。問題是我的自定義類包含結構,枚舉等。我嘗試了下面的方法。如何在Coredata中存儲帶結構的自定義對象
- (void)encodeWithCoder:(NSCoder *)編碼器。
,但我得到這個錯誤
[的NSKeyedArchiver encodeValueOfObjCType:在:]:此歸檔無法編碼結構
什麼是這個對象存儲Coredata的最佳實踐。請幫幫我。
我必須將自定義類對象存儲到Coredata。問題是我的自定義類包含結構,枚舉等。我嘗試了下面的方法。如何在Coredata中存儲帶結構的自定義對象
- (void)encodeWithCoder:(NSCoder *)編碼器。
,但我得到這個錯誤
[的NSKeyedArchiver encodeValueOfObjCType:在:]:此歸檔無法編碼結構
什麼是這個對象存儲Coredata的最佳實踐。請幫幫我。
你可以用在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)];
對於一個struct,我認爲最好是創建一個可以對結構進行編碼和解碼的函數,就像任何Objective-C對象一樣。
有了枚舉,我不太確定。枚舉只是與名字相關的數字,所以只需編碼並將它們解碼爲數字。
你應該有NSCoding的自定義實現協議在您的自定義類中。在你自己的實現-[initWithCoder:]
和-[encodeWithCoder:]
中,你可以用任何你喜歡的方式對結構對象進行編碼/解碼。
在途中要做的是撥打電話[coder encodeObject:[NSValue valueWithBytes:&yourStructVariable objCType:@encode(struct YourStructName)] forKey:@"someKey"];
-[encodeWithCoder:]
並在-[initWithCoder:]
做相應的解碼。
然後,您可以將類對象存儲爲可轉換的核心數據。
使用NSValue valueWithBytes是拋出OP提到的異常。 – 2013-07-31 18:31:08
使用dataWithBytes:length:在不同的endian或32/64位平臺之間不可移植。使用這將導致老數據卡住給定設備,用戶將無法升級到不同的平臺,或者在不同於創建它的平臺上傳輸/打開文件。 – 2010-08-17 04:05:00
@Brent當然......但問題是關於iPhone,我認爲這應該在幾年內運行良好......如果蘋果公司將改變硬件我相信(一)他們將有一段時間使用模擬器來帶來儘可能多的軟件(b)程序將不得不重新編譯並且可以在那時(如果需要的話)進行修復......並且這僅僅是創建/存儲在一種類型的硬件上的「數據」的問題,這是轉移到一個新的不同的架構... – epatel 2010-08-17 05:32:37
@epatel我有客戶在PPC和英特爾傳輸CoreData備份文件到/從iPhone。如果我聽了這個建議,會讓我頭痛。您可以爲iPhone構建ARM 6/7代碼,將來不會考慮32/64位胖二進制文件。這是一個「小心」的評論,我推薦下面提到的NSCoder方法,它永遠是安全的,不僅僅是在短期內「幾年」。 – 2010-08-18 19:13:53