【问题标题】:Retrieving a C- based struct from CoreData从 CoreData 检索基于 C 的结构
【发布时间】:2011-08-13 15:30:52
【问题描述】:

我一直在做一个使用 C 库的项目,我的项目需要在 coredata 中存储一些 c 结构。如何通过不将其转换为目标 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 值以及数据值。我不明白是什么问题。

提前谢谢..

【问题讨论】:

    标签: ios core-data opencv


    【解决方案1】:

    ...我的项目需要存储一些 c coredata 中的结构体。我怎样才能做到这一点 通过不将其转换为目标 c 对象。

    你真的不能可靠地做到这一点。 Core Data 存储对象,结构不是对象。原则上,您可以将结构转换为数据对象,但由于不同硬件解释数据的方式,这是一个脆弱的解决方案。如果有人将商店移动到另一台设备,则结构可能会有所不同。

    最安全的解决方案是简单地编写一个转换器,将结构转换为对象值,然后再返回。假设您有一个具有两个 int 值的结构。您可以将每个 int 转换为 NSNumber,将它们放入数组中,然后将该数组作为存档存储在数据属性中。或者,您可以创建一个模仿结构的实体。我更喜欢后一种方法。

    【讨论】:

      【解决方案2】:

      您可以将其存储为基础值并重新创建它。

      或者,您可以将其存储为“可变形”属性。 Core Graphics 对于各种结构类型(例如 CGRect)有类似的东西。在数据模型中将类型标记为“可转换”,然后在实体类中显式创建 getter 和 setter。

      您需要像 Core Graphics 一样创建将属性转换为字符串的函数,例如CGRectFromString 和 NSStringFromCGRect。

      如果您仍想将其存储为二进制数据,则使用此链接中描述的类似内容可能会更成功地对其进行编码和解码:How to store custom objects with struct in Coredata

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多