2010-02-21 18 views
6

के लिए विशेषता प्रकार मैं कोर डेटा के साथ शुरू कर रहा हूं और अभी मैं अपना डेटा मॉडल बना रहा हूं। मुझे अपनी इकाई के लिए एक यूआईसीओलर विशेषता चाहिए, लेकिन विशेषता के लिए प्रकार ड्रॉपडाउन के पास इसके लिए कोई विकल्प नहीं है। क्या मैं इसे अपरिभाषित या क्या सेट करता हूं?कोर डेटा डेटा मॉडल: यूआईसीओलर

धन्यवाद

उत्तर

16

क्या आप शायद चाहते हैं एक बदला जाने वाला विशेषता है। कोर डेटा प्रोग्रामिंग गाइड में एक अन्य पढ़ने में "Non-standard Persistent Attributes" पर अनुभाग दें। एक परिवर्तनीय विशेषता, कवर के नीचे, एक द्विआधारी डेटा विशेषता है, लेकिन कोर डेटा स्वचालित रूप से NSValueTransformer आपके विनिर्देश के क्रमशः आपके लिए तार्किक विशेषता मान को क्रमबद्ध और अनुक्रमित करने के लिए उपयोग करेगा। NSCoding अनुपालन वाले मानों के लिए, NSKeyedUnarchiveFromDataTransformerName (जो डिफ़ॉल्ट ट्रांसफार्मर है) चाल करेगा।

बेशक, कोर डेटा किसी SQLite बैकएंड के लिए या इस परिवर्तनीय मान के विरुद्ध क्वेरी नहीं कर सकता है।

20

मैं definitve जवाब मैं डेव मार्क और जेफ LeMarche द्वारा अधिक iPhone 3 विकास में पाया व्याख्या करेंगे:

आमतौर पर हम डिफ़ॉल्ट के रूप में बदला जाने वाला विशेषता के ट्रांसफार्मर वर्ग छोड़ने के लिए सक्षम होगा, NSKeyedUnarchiveFromData, और किया जा सकता है, लेकिन इस मामले में हम नहीं कर सकते क्योंकि UIColorNSCoding के अनुरूप नहीं है और NSKeyedArchiver का उपयोग करके संग्रहीत नहीं किया जा सकता है। परिवर्तन को संभालने के लिए हमें मैन्युअल रूप से मूल्य ट्रांसफार्मर लिखना होगा।

अपनी इकाई में एक विशेषता जोड़ें और विशेषता "रंग" या जो भी नाम आप चाहते हैं उसे कॉल करें। इसके प्रकार को ट्रांसफॉर्म करने योग्य पर सेट करें। अपने "वैल्यू ट्रांसफार्मर नेम" को पर सेट करें UIColorRGBValueTransformer। ध्यान दें कि डेटा मॉडल संपादक यह सुनिश्चित करने के लिए वैल्यू ट्रांसफार्मर नाम: मान्य नहीं करता है, इसलिए ध्यान से टाइप करें।

एक नई फ़ाइल, NSObject का एक उपवर्ग बनाएँ, और इसे नाम UIColorRGBValueTransformer.m

पर क्लिक करें UIColorRGBValueTransformer.h और NSObject से NSValueTransformer में सुपरक्लास बदलें। इसके अलावा, #import <Foundation/Foundation.h> से #import <UIKit/UIKit.h> बदलें, क्योंकि UIColorUIKit का हिस्सा है, Foundation नहीं।

अब UIColorRGBValueTransformer.m में, हम चार विधियों है कि हमारे मूल्य ट्रांसफार्मर वर्ग NSData और इसके विपरीत UIColor के उदाहरण रूपांतरित करने की अनुमति को लागू करने की जरूरत है। UIColorRGBValueTransformer.m में यह कोड शामिल: में UIColorRGBValueTransformer.hआयात करने के लिए की जरूरत के बिना

[self.managedObject setValue:color forKey:self.keyPath]; 

:

#import "UIColorRGBValueTransformer.h" 

@implementation UIColorRGBValueTransformer 

// Here we override the method that returns the class of objects that this transformer can convert. 
+ (Class)transformedValueClass { 
    return [NSData class]; 
} 

// Here we indicate that our converter supports two-way conversions. 
// That is, we need to convert UICOLOR to an instance of NSData and back from an instance of NSData to an instance of UIColor. 
// Otherwise, we wouldn't be able to beth save and retrieve values from the persistent store. 
+ (BOOL)allowsReversTransformation { 
    return YES; 
} 

// Takes a UIColor, returns an NSData 
- (id)transfomedValue:(id)value { 
    UIColor *color = value; 
    const CGFloat *components = CGColorGetComponents(color.CGColor); 
    NSString *colorAsString = [NSString stringWithFormat:@"%f,%f,%f,%f", components[0], components[1], components[2], components[3]]; 
    return [colorAsString dataUsingEncoding:NSUTF8StringEncoding]; 
} 

// Takes an NSData, returns a UIColor 
- (id)reverseTransformedValue:(id)value { 
    NSString *colorAsString = [[[NSString alloc] initWithData:value encoding:NSUTF8StringEncoding] autorelease]; 
    NSArray *components = [colorAsString componentsSeparatedByString:@","]; 
    CGFloat r = [[components objectAtIndex:0] floatValue]; 
    CGFloat g = [[components objectAtIndex:1] floatValue]; 
    CGFloat b = [[components objectAtIndex:2] floatValue]; 
    CGFloat a = [[components objectAtIndex:3] floatValue]; 
    return [UIColor colorWithRed:r green:g blue:b alpha:a]; 
} 

@end 

एक और फाइल में अब, आप की तरह कोड की एक पंक्ति शामिल कर सकते हैं फ़ाइल।

+1

इस उत्तर अद्भुत है, यह पता लगा है | कभी नहीं । एक छोटा संपादन, "रिवर्स ट्रान्सफॉर्मेशन" और "ट्रांसफॉम्ड वैल्यू" गलत वर्तनी है, लेकिन आवश्यक 6 अक्षरों के संपादन के लिए केवल 2 खाते को ठीक करना है। – rob5408

+13

हालांकि इसके लिए काम किया गया था, यह ध्यान दिया जाना चाहिए कि यूआईसीओलोर वास्तव में एनएससीओडी के अनुरूप है (उपर्युक्त क्या है इसके विपरीत) और एक विशेष ट्रांसफॉर्मर की आवश्यकता नहीं होनी चाहिए। – rob5408

3

क्या यूआईसीओलर को हेक्स (एफएफएफएफएफएफ, या अन्य वेब-सुरक्षित रंगों) के रूप में स्ट्रिंग के रूप में स्टोर करना संभव है और फिर जब आप रंग पढ़ने के लिए आते हैं, तो आप स्ट्रिंग को उस प्रारूप में रूपांतरित करते हैं जिसे यूआईसीओलर समझ सकता है?

3

रंग विशेषता को रंगीनडेटा ट्रांसफॉर्मर के साथ बदलने योग्य के रूप में निर्दिष्ट करने के बाद। हम बस MangatedObjectSubclass पैदा करते हैं और ट्रांसफार्मर कोड लिख सकते हैं अंदर यह

//SampleEntity.h

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 
@interface SampleEntity : NSManagedObject 
@property (nonatomic, retain) UIColor *color; 
@end 

@interface ColorToDataTransformer : NSValueTransformer 
@end 

//SampleEntity.m

#import "SampleEntity.h" 

@implementation SampleEntity 

@dynamic color; 

@end 

@implementation ColorToDataTransformer 

+ (BOOL)allowsReverseTransformation { 
    return YES; 
} 

+ (Class)transformedValueClass { 
    return [NSData class]; 
} 


- (id)transformedValue:(id)value { 
    UIColor *color = (UIColor *)value; 
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:color]; 
    return data; 
} 

- (id)reverseTransformedValue:(id)value { 
    NSData *data = (NSData *)value; 
    UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
    return color; 
} 

@end