我一直在做一个使用C库的项目,我的项目需要在coredata中存储一些C结构体。如果我不把它转换成objective - 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结构体时,我得到奇怪的颜色和行值以及数据值。我不明白是什么问题。
Thanks in advance.
您可以将其存储为基础值并重新创建它。
或者您可以将其存储为"Transformable"属性。Core Graphics对各种结构类型(如CGRect)也有类似的功能。在数据模型中,将类型标记为"Transformable",然后显式地在实体类中创建getter和setter。
你需要像Core Graphics那样创建函数将属性转换为字符串,例如CGRectFromString和nsstringfromgrect。
如果你仍然想把它存储为二进制数据,你可能会有更多的成功编码和解码使用类似的东西在这个链接中描述:如何存储自定义对象与结构在Coredata.
…我的项目需要存储一些ccoredata中的结构。我该怎么做呢不把它转化为目标c对象。
你真的不能可靠地做这件事。Core Data存储对象和结构体不是对象。原则上,可以将结构体转换为数据对象,但由于不同硬件解释数据的方式不同,这是一个脆弱的解决方案。如果有人将存储库移动到另一个设备上,结构体可能会产生不同的结果。
最安全的解决方案是简单地编写一个转换器,将结构转换为对象值,然后再转换回来。假设你有一个有两个int值的结构体。你会把每个int转换成NSNumber,把它们放到一个数组中然后把这个数组作为存档存储在一个数据属性中。或者,您可以创建一个模仿该结构的实体。我更喜欢后一种方法。