2012-04-05 31 views
5

Một trong các đối tượng mô hình của tôi có một thuộc tính enum. Để lưu trữ nó trong CoreData, tôi đã sử dụng một đối tượng NSNumber.Lưu trữ một thuộc tính enum bên trong CoreData và làm cho nó thuận tiện

Tuy nhiên, tôi muốn truy cập nó dưới dạng kiểu enum một cách thuận tiện. Thực hành tốt nhất để đạt được điều đó là gì?

Cho đến giờ, tôi đã đi với mã sau.

trong MyObject.h

typedef enum _ABType { 
    ABTypeUnknown, 
    ABTypeValue1, 
    ... 
    ABTypeValueN 
} ABType; 

@interface MyObject : NSManagedObject 

@property (nonatomic, retain) NSNumber * myPersistentEnum; // Defined in my Core Data model 

@property (nonatomic) ABType myConvenientEnum; 

trong MyObject.m

@dynamic myPersistentEnum; 

- (BOOL)isValidEnumValue { 
    if (self.myPersistentEnum) { 
     int intValue = [self.type intValue]; 
     if (intValue >= ABTypeValue1 && intValue <= ABTypeValueN) { 
      return YES; 
     }   
    } 

    ELog(@"Undefined enumValue %@", self.myPersistentEnum); 
    return NO; 
} 

- (ABType)myConvenientEnum { 
    if ([self isValidEnumValue]) { 
     return [self.type intValue]; 
    } 

    return ABTypeUnknown; 
} 

- (void)setMyConvenientEnum:(ABType)enumValue { 
    NSNumber *oldValue = [self.myPersistentEnum retain]; 
    self.myPersistentEnum = [NSNumber numberWithInt:enumValue]; 
    if ([self isValidEnumValue]) { 
     [oldValue release]; 
    } else { 
     self.myPersistentEnum = oldValue; 
     [oldValue release]; 
    } 
} 

Câu hỏi của tôi là:

  • Có điều gì sai trong đoạn code trên?
  • Có phải int loại quyền sử dụng khi chuyển đổi enum thành NSNumber? (NSNumber không cung cấp phương thức -(enum)enumValue;)
  • Bạn có để lại khía cạnh xác thực cho xác thực mô hình CoreData thời gian chạy không?
  • [MỚI] Làm cách nào để tôi có thể làm rõ cho các nhà phát triển khác rằng nên sử dụng thuộc tính tiện lợi chứ không phải thuộc tính NSNumber?

Trả lời

0

CoreData trong iOS 5 hỗ trợ các kiểu số nguyên gốc, vì vậy bạn có thể sử dụng loại thay vì NSNumber nếu muốn.

EDIT

FWIW, trình biên dịch có thể làm cho enum càng nhỏ càng cần thiết cho các giá trị có thể nó giữ. Tốt nhất là bỏ enum - (int) myEnumValue - khi gán vào một NSNumber, bởi vì nó giả định kiểu là kích thước chính xác bạn cho nó biết.

+0

Tuyệt, tôi không biết điều này. Rất tiếc, các ứng dụng tôi đang làm việc phải hỗ trợ iOS 4, ít nhất là trong vài tháng nữa. –