2011-04-27 25 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,把它们放到一个数组中,然后将数组作为一个存档存储在数据属性中。或者,您可以创建一个模仿该结构的实体。我更喜欢后一种方法。