2011-04-27 54 views
0

我一直在研究一個使用C庫的項目,並且我的項目需要在coredata中存儲一些c結構體。我如何通過不將它轉換爲客觀的c對象來做到這一點。從CoreData中檢索基於C的結構體

我想存儲一個Opencv結構體(CvMat *)。

/* binding stuff example*/ 
CvMat *mat = cvCreateMat(3, 3, CV_32FC1); 
// fill the matrix.. 
human.projVal = [NSData dataWithBytes:mat length:sizeof(mat)]; 
// then store it in core data 
.. 


/* retrieving stuff */ 
.. 
NSData *data = [[humansArray objectAtIndex:0] projVal];  
CvMat *mat = (CvMat *)[data bytes]; 
NSLog(@"cols =>> %i rows =>> %i",mat->cols,mat->rows); 

for (int i=0; i<9; i++) { 
    NSLog(@"%f",mat->data.fl[i]); 
} 

當我嘗試檢索coredata CvMat中的結構,我得到奇怪的cols和rows值,也數據值。我不明白是什麼問題。

在此先感謝..

回答

0

你可以把它存爲基本價值和重新創建它。

或者,您可以將其存儲爲「Transformable」屬性。核心圖形對於各種結構類型(例如CGRect)具有相似性。在數據模型中,將類型標記爲「Transformable」,然後在實體類中顯式創建getter和setter。

您需要創建函數,將屬性轉換爲像Core Graphics一樣的字符串,例如, CGRectFromString和NSStringFromCGRect。

如果您仍然希望將其作爲二進制數據存儲,則可以使用此處所述的此類鏈接進行更多的成功編碼和解碼:How to store custom objects with struct in Coredata

0

...我的項目需要存儲coredata中的一些c結構體c 。我怎樣才能做到這一點 通過不將它轉換爲客觀的c 對象。

你真的無法可靠地做到這一點。核心數據存儲對象和結構不是對象。原則上,您可以將結構轉換爲數據對象,但由於不同硬件解釋數據的方式,這是一個脆弱的解決方案。如果有人將商店移至其他設備,結構可能會有所不同。

最安全的解決方案是簡單地編寫一個轉換器,將結構轉換爲對象值,然後再返回。假設你有一個具有兩個int值的結構體。你可以將每個int轉換爲一個NSNumber,把它們放到一個數組中,然後將數組作爲一個存檔存儲在數據屬性中。或者,您可以創建一個模仿該結構的實體。我更喜歡後一種方法。