2010-10-11 10 views
10

Coredata ile ilgili bazı sorunların olduğunu düşünüyorum, ancak bazı basit vakaları bana açıklayabiliyorsa, bu durumun benim için önemli olduğunu düşünüyorum.Çekirdek verilerde CGRect ve diğer şeyler nasıl depolanır

Modelimi coredata'ya eklemek istiyorum ve en basit durumda geri alma/yineleme işleminden yararlanın. Şey, gördüğüm tüm örnekler dizeleri veya tam sayıları depolamaya eğilimlidir. Ne çekirdek verilerinde (uydurulmuş bir örnek) uygulamaya istediğini şöyle bir sınıf varsa:

@interface Badge : NSObject { 

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

Bunların hepsi yerinde oluşur, ancak her bir karışıklığa

vurgulamak Gördüğüm gibi, .xcdatamodel'i açıp NSManagedObject olan "Badge" adlı yeni bir Varlık ekleyeceğim. Daha sonra textForBadgeString türünde bir özellik ekledim. Çok uzak çok iyi. BadgeValue için benzer bir şey yapıyorum, ancak UIColor ve CGRect'a geliyorum ve biraz tuhafım, çünkü bunlar için bir özellik yok. Her biri (yani, x,y,w,h dört özelliğine sahip Rect varlık) temsil eden bir varlık oluşturmam gerekiyordu. Sonra her seferinde bir CGRect'i bu mürekkeplerle doldurun mu? UIColor için Ditto?

Son olarak, awards listeme gelirim. Bunlar bir ödülü temsil eden bir dizi nesnenin işaretçilerinin bir listesiyse, bir resim, bir renk, metin vb. Içerebilirler. award'un tekrar tasarladığım bir varlık olacağını varsayalım. BadgeAward sınıfına bir çok ilişki var.

Bunlardan herhangi birini alıyorum mı yoksa karşı yöne mi giriyorum? Gördüğüm tüm örnekler String ya da int gibi vanilya nesnelerine işliyor, bu yüzden bir sürü şey yapmadan önce kafamda bu haklara sahip olduğumdan emin olmak istiyorum.

Saygılarımızla

Bryn

cevap

5

Bu, ilgili belgeler geçerli: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html ama aslında sen Çekirdek Veriler standart dışı özellikleri ve şeylerin olabildiğince çeşitleri arasında çevirmek için bir yol sağlamak zorunda saklayın. Bunu yapmanın iki yolu var. Dönüştürülebilir nitelikler ve değer dönüştürücüleri kullanın veya geçici özellikleri kullanın ve yalnızca yönetilen nesne içeriği kaydedileceği zaman dönüştürmeyi gerçekleştirin.

Çoğu durumda, açıkladığınız şeyi (CGRect gibi bir öğenin bileşenlerini depolamak için özel varlıkları tanımlama) aşırı olduğunu düşünüyorum.

+1

Burada atıfta bulunduğunuz bağlantı ölüdür. @AndrewMadsen –

22

Özellikle CGRect ile ilgili olarak NSStringFromCGRect a CGRect mağazasını NSString olarak kullanabilirsiniz. O zaman geri dönüştürmek için CGRectFromString kullanın: Bu veriyor

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

kolayca NSManagedObject depolamak için. Daha sonra dönüştürmek için uygulamanızda özel bir erişimci ekleyebilirsiniz:

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

Bu güzel! Teşekkürler –

9

Sen aegzorz önerdiği NSStringFromCGRect seri kullandığı durumlarda dikkatli olmak zorunda. Bu, NSString temsilinde kısaltılmış olan büyük sayılar için güvenilir bir şekilde çalışmaz.Örneğin

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

irade çıkışı Bence ayrı dört değerlerini depolamak için daha iyi ise

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

. Çekirdek Veri CGRect gibi UIColor nesneleri ve yapıları saklanması

16

(OP bu konuda sorulan beri bu yeni olabilir) oldukça kolaydır:

Modelinizdeki dönüştürülebilir nesneleri tanımlayın:

snapshot of Core Data model

NSManagedObject sınıflarında

tanımlar ve kullanımı UIColor normal nesneleri:

@property (nonatomic, retain) UIColor *foreground; 

textView.textColor = element.foreground; 

Sarma CGRect str Bir NSValue nesnesindeki yollar:

+0

Bu tür şeyler yapmanın önerilen yolu budur – Jack

İlgili konular