2010-10-11 1 views
10

У меня проблемы с прорезями с coredata, но я чувствую, что это сильно раскроет мне ситуацию, если кто-нибудь сможет объяснить мне некоторые простые случаи.Как хранить CGRect и другие вещи в основных данных

Я хочу поставить свою модель в coredata, и в самом простом случае воспользуйтесь отменой/повторением. Дело в том, что все примеры, которые я вижу, имеют тенденцию хранить либо строки, либо целые числа. Что делать, если у меня есть класс, как следует, что я хотел бы реализовать в основных данных (а составленный пример):

@interface Badge : NSObject { 

NSString *textForBadge; 
int  badgeValue; 
UIColor *color; 
CGRect rect; 
NSMutableArray *awards; // this would be a list of 'Category' - another custom class 
} 

Они все сделали на месте, но каждый выделить путаницу

Как я вижу, я открою .xcdatamodel и добавлю новый привязанный «Значок», который будет NSManagedObject. Затем я добавляю свойство для textForBadge типа String. Все идет нормально. Я делаю что-то похожее для badgeValue, но затем перехожу к UIColor и CGRect, и я немного тупик, поскольку для них нет собственности. Я должен создать объект для представления каждого (например, объект Rect, который имеет четыре свойства x,y,w,h), которые являются ints? Затем каждый раз заполняйте CGRect этими ints? То же для UIColor?

И, наконец, я прихожу в список awards. Если это список указателей на ряд объектов, представляющих награду, они могут содержать изображение, цвет, текст и т. Д. Я предполагаю, что award снова будет сущностью, которую я должен создать, а не Badge, хранящей массив, который у меня был бы от 1 до многих отношений от него до класса Award.

Имею ли я право на это или собираюсь конкурировать в противоположном направлении? Все примеры, которые я вижу, работают с ванильными объектами, такими как String или int, поэтому я хочу, чтобы у меня было это прямо в голове, прежде чем реализовать кучу вещей.

С наилучшими пожеланиями,

Брин

ответ

5

Это соответствующая документация: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html но, по существу, вы должны обеспечить путь для основных данных для перевода между своими нестандартными свойствами и видами вещей, она может магазин. Есть два способа сделать это. Либо использовать трансформируемые атрибуты и трансформаторы значений, либо использовать переходные свойства, и выполнять преобразование только тогда, когда контекст управляемого объекта будет сохранен.

Я думаю, что в большинстве случаев то, что вы описываете (определение пользовательских объектов для хранения компонентов чего-то типа CGRect), является излишним.

+1

Ссылка, на которую вы ссылаетесь, мертва. @AndrewMadsen –

22

В частности, относительно CGRect вы можете использовать NSStringFromCGRect магазин a CGRect как NSString. Затем используйте CGRectFromString, чтобы преобразовать его обратно:

CGRect rect = CGRectMake(5, 5, 40, 30); 
NSString* rectAsString = NSStringFromCGRect(rect); 
CGRect original = CGRectFromString(rectAsString); 

Это позволяет легко хранить его в NSManagedObject. Вы можете добавить пользовательский аксессор в своей реализации, чтобы преобразовать его:

- (CGRect)realRect { 
    return CGRectFromString(self.rectAsString); 
} 
+0

Это хорошо! Спасибо –

9

Вы должны быть осторожны, если вы используете сериализацию NSStringFromCGRect предложенную aegzorz. Это не работает надежно для больших чисел, которые сокращаются в представлении NSString.

Например, этот код

CGRect test1 = CGRectMake(CGFLOAT_MAX, CGFLOAT_MAX, CGFLOAT_MAX, CGFLOAT_MAX); 
NSString* test1Str = NSStringFromCGRect(test1); 
CGRect test2 = CGRectFromString(test1Str); 
NSLog(@"test1: %f %f %f %f", test1.origin.x - CGFLOAT_MAX, test1.origin.y - CGFLOAT_MAX, test1.size.width - CGFLOAT_MAX, test1.size.height - CGFLOAT_MAX); 
NSLog(@"test2: %f %f %f %f", test2.origin.x - CGFLOAT_MAX, test2.origin.y - CGFLOAT_MAX, test2.size.width - CGFLOAT_MAX, test2.size.height - CGFLOAT_MAX); 

выведет

test1: 0.000000 0.000000 0.000000 0.000000 
test2: -344800963262078397207103271862272.000000 -344800963262078397207103271862272.000000 -344800963262078397207103271862272.000000 -344800963262078397207103271862272.000000 

На мой взгляд, лучше хранить четыре значения отдельно.

16

Сохранение объектов и структур UIColor как CGRect в Core Data довольно легко (это может быть новым, так как OP спросил об этом):

Определить объекты как трансформируемые в модели:

snapshot of Core Data model

В классах NSManagedObject определить и использовать UIColor объекты обычно:

@property (nonatomic, retain) UIColor *foreground; 

textView.textColor = element.foreground; 

Wrap CGRect ул в объекте NSValue:

@property (nonatomic, retain) NSValue *imageRect; 

CGRect imageRect = [self.imageRect CGRectValue]; 
imageRect.size.width = 100; 
self.imageRect = [NSValue valueWithCGRect:imageRect]; 
+0

Это рекомендуемый способ сделать этот материал – Jack

Смежные вопросы