Извлечение структуры на основе C из CoreData - PullRequest
0 голосов
/ 27 апреля 2011

Я работал над проектом, который использует библиотеки 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]);
}

когда я пытаюсь извлечь структуру cvMat из coredata, я получаю странные значения столбцов и строк, а также значения данных. Я не могу понять, в чем проблема.

Заранее спасибо ..

Ответы [ 2 ]

0 голосов
/ 27 апреля 2011

... мой проект должен хранить некоторые c структуры в coredata. Как я могу это сделать не превращая его в цель с объект.

Вы действительно не можете сделать это надежно. Базовые данные хранят объекты и структуры не являются объектами. В принципе, вы можете преобразовывать структуры в объекты данных, но это хрупкое решение из-за того, как различное оборудование интерпретирует данные. Если кто-то переносит магазин на другое устройство, структуры могут выйти по-другому.

Самое безопасное решение - просто написать преобразователь, который преобразует структуры в значения объекта, а затем обратно. Скажем, у вас была структура с двумя значениями типа int. Вы должны преобразовать каждое int в NSNumber, поместить их в массив, а затем сохранить массив как архив в атрибуте данных. Кроме того, вы можете создать объект, который имитирует структуру. Я предпочитаю последний метод.

0 голосов
/ 27 апреля 2011

Вы можете сохранить его как базовые значения и заново создать его.

В качестве альтернативы вы можете сохранить его как атрибут "Transformable". Базовая графика имеет нечто похожее для различных типов структур, таких как CGRect. В модели данных пометьте тип как «Transformable», затем явно создайте методы получения и установки в вашем классе сущности.

Вам потребуется создать функции, которые преобразуют свойства в строку, как это делает Core Graphics, например CGRectFromString и NSStringFromCGRect.

Если вы все еще хотите сохранить его в виде двоичных данных, возможно, вам удастся более успешно кодировать и декодировать его, используя что-то вроде этого, описанное здесь в этой ссылке: Как хранить пользовательские объекты со структурой в Coredata .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...