2010-10-11 7 views
10

Mam kilka ząbkujących problemów z coredatą, ale czuję, że bardzo by to dla mnie wyjaśniono, gdyby ktoś mógł wyjaśnić mi kilka prostych spraw.Jak przechowywać CGRect i inne rzeczy w danych podstawowych

Chcę umieścić mój model w coredatach, aw najprostszym przypadku skorzystać z funkcji cofania/ponawiania. Rzecz w tym, że wszystkie przykłady, które widzę, przechowują albo ciągi, albo liczby całkowite. Co zrobić, jeśli mam klasy następująco że chciałem wdrożyć w danych podstawowych (wymyślonym przykładzie):

@interface Badge : NSObject { 

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

Są to wszystko składa się na miejscu, ale każdy podświetlić zamieszanie

Jak widzę, otwieram plik .xcdatamodel i dodaję nową znaczek "Entity caled", który będzie oznaczał NSManagedObject. Następnie dodam właściwość dla textForBadge typu String. Jak na razie dobrze. Robię coś podobnego dla badgeValue, ale potem przychodzę do UIColor i CGRect i jestem trochę zakłopotany, ponieważ nie ma dla nich właściwości. Czy mam utworzyć podmiot, który będzie reprezentował każdą (tj. Jednostkę Rect, która ma cztery właściwości x,y,w,h), które są ints? Następnie za każdym razem zapełniasz CGRect tymi intami? Ditto na UIColor?

Ostatecznie przejdę do mojej listy awards. Jeśli są to listy wskaźników do wielu obiektów reprezentujących nagrodę, mogą zawierać obraz, kolor, tekst itp. Zakładam, że award znowu będzie podmiotem, który muszę zaprojektować, a nie Badge przechowywać tablicę, którą miałbym 1 do wielu relacji z niego do klasy Award.

Czy otrzymuję coś w tym stylu, czy zmierzam w przeciwnym kierunku? Wszystkie przykłady, które widzę, działają na obiektach waniliowych, takich jak String lub int, więc chcę mieć pewność, że mam to w głowie, zanim zaimplementuję kilka rzeczy.

poważaniem,

Bryn

Odpowiedz

5

Jest odpowiednia dokumentacja: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html ale w istocie, trzeba zapewnić drogę Rdzeń danych tłumaczyć między niestandardowych właściwości i rodzaju rzeczy, może on sklep. Można to zrobić na dwa sposoby. Użyj transformowalnych atrybutów i transformatorów wartości lub użyj właściwości przejściowych i wykonaj konwersję tylko wtedy, gdy zapisany zostanie kontekst obiektu zarządzanego.

Myślę, że w większości przypadków to, co opisujesz (definiowanie niestandardowych elementów do przechowywania komponentów typu CGRect), jest przesadą.

+1

Link, o którym tutaj mowa, jest martwy. @AndrewMadsen –

22

W szczególności w odniesieniu do CGRect można użyć NSStringFromCGRect zapamiętaj jako CGRect jako . Następnie użyj CGRectFromString przekonwertować go z powrotem:

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

Pozwala to na łatwe przechowywanie go w NSManagedObject. Następnie można dodać niestandardową akcesor w implementacji, aby ją przekształcić:

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

To jest miłe! Dzięki –

9

Trzeba być ostrożnym, jeśli użyć serializacji NSStringFromCGRect sugerowanego przez aegzorz. Nie działa to niezawodnie dla dużych liczb, które są skracane w reprezentacji NSString.

Na przykład ten kod

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); 

wyjście wola

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

Moim zdaniem lepiej jest przechowywać cztery wartości oddzielnie.

16

Przechowywanie przedmiotów i struktur UIColor jak CGRect w danych Core jest dość łatwe (może to być nowe, ponieważ PO pytani o nią):

Definiowanie obiektów jak Transformable w modelu:

snapshot of Core Data model

W klasach NSManagedObject definiować i używać UIColor obiektów normalnie:

@property (nonatomic, retain) UIColor *foreground; 

textView.textColor = element.foreground; 

Wrap CGRect str uctures w obiekcie NSValue:

@property (nonatomic, retain) NSValue *imageRect; 

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

Jest to zalecany sposób robienia tego rodzaju rzeczy – Jack

Powiązane problemy