2009-06-20 27 views
14

Tôi đang sử dụng Dữ liệu cốt lõi theo chương trình (tức là không sử dụng .xcdatamodel tệp mô hình dữ liệu) theo cách tương tự như được mô tả trong Apple Core Data Utility Tutorial. Vì vậy, vấn đề của tôi là khi tôi cố gắng để thêm một thuộc tính cho một thực thể với các loại NSBooleanAttributeType, nó được một chút lỗi. Khi tôi thêm nó vào NSManagedObject file header lớp con của tôi (trong hướng dẫn này, đó sẽ là Run.h) nhưLoại cho các thuộc tính boolean trong các thực thể Core Data là gì?

@property (retain) BOOL *booleanProperty; 

biên dịch thất bại, nói error: property 'booleanProperty' with 'retain' attribute must be of object type.

Nó có vẻ như một số nơi ở Cocoa sử dụng NSNumber đối tượng để đại diện cho các phép toán luận, vì vậy tôi cố gắng thiết lập nó để

@property (retain) NSNumber *booleanProperty; 

để thay thế. Tuy nhiên, điều này gợi lên các lỗi runtime sau:

*** -[NSAttributeDescription _setManagedObjectModel:]: unrecognized selector sent to instance 0x101b470 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSAttributeDescription _setManagedObjectModel:]: unrecognized selector sent to instance 0x101b470' 

Sử dụng GDB, tôi có thể tìm lại này vào dòng trong mã nguồn của tôi, nơi tôi thêm thực thể của tôi để mô hình đối tượng quản lý:

[DVManagedObjectModel setEntities:[NSArray arrayWithObjects:myEntityWithABooleanAttribute, myOtherEntity]]; 

Vì vậy, câu hỏi của tôi là: loại gì tôi nên đặt booleanProperty vào tiêu đề lớp tùy chỉnh của tôi?

Trả lời

18

Hãy thử:

@property (nonatomic) BOOL booleanProperty; 

Vấn đề là bạn sử dụng giữ lại trong định nghĩa tài sản. Cho rằng bạn phải có một thuộc tính cho một lớp Objective-C (nó sẽ có thể hiểu được phương thức 'giữ lại'). BOOL không phải là một lớp học mà là một bí danh cho char đã ký.

+0

Cũng đáng chỉ ra rằng đó là “BOOL booleanProperty”, không có *. * Chỉ dành cho con trỏ, bao gồm con trỏ đối tượng. –

+1

Xem [trả lời này] (http://stackoverflow.com/a/3934284/164989) để có giải pháp thích hợp hơn. – opsidao

+0

Câu trả lời này sẽ bị xóa vì nó không chính xác. –

2

Tôi không biết nếu điều này chỉ là một lỗi đánh máy trên một phần của bạn, nhưng điều này:

[NSArray arrayWithObjects:myEntityWithABooleanAttribute, myOtherEntity] 

chắc chắn là sai. Tham số cuối cùng của phương thức đó phải luôn là 0.

+0

Cảm ơn bạn đã chỉ ra điều đó! Đó là một lỗi đánh máy. –

6

Một trong những cách tốt nhất để tạo accessors đúng trong lớp con NSManagedObject của bạn là để đưa lên trình đơn ngữ cảnh trên một thuộc tính hoặc tài sản trong công cụ mô hình dữ liệu và chọn một trong các lệnh sau:

  • Sao chép Method tờ khai to Clipboard
  • Sao chép Phương pháp Triển khai to Clipboard
  • Sao chép obj-C tờ khai 2.0 Phương pháp to Clipboard
  • Sao chép obj-C Triển khai 2.0 Phương pháp to Clipboard
3

Thuộc tính loại Boolean trong NSManagedObject thuộc loại NSCFBoolean. Đây là một lớp con riêng của NSNumber.

18

Tôi sẽ không đề xuất phương pháp do Diederik Hoogenboom đề xuất (tôi gặp lỗi ngay cả khi thuộc tính dữ liệu cốt lõi của tôi được đặt là Boolean).

Đó là giá trị chỉ ra rằng mặc dù dòng này sẽ làm việc cho một đối tượng tùy chỉnh, nó sẽ không làm việc cho một lớp con của NSManagedObject:

@property (nonatomic) BOOL booleanProperty; 

tài sản của bạn nên được thiết lập như thế này:

@property (nonatomic, retain) NSNumber *booleanProperty; 

Khi tôi sao chép các khai báo phương thức cho loại Boolean (sử dụng kỹ thuật do Jim Correia đề xuất), getter và setter được nhập là:

NSNumber:-(NSNumber *)booleanProperty; 
-(void)setBooleanProperty:(NSNumber *)value; 

... đây là những gì thuộc tính Boolean trong dữ liệu cốt lõi được thiết lập như, và bạn cần phải xác nhận tài sản của bạn với một cái gì đó như thế này:

-(BOOL)validateBooleanProperty:(NSNumber **)toValidate error:(NSError **)outError 
{ 
    int toVal = [*toValidate intValue]; 

    if ((toVal < 0) || (toVal > 1)) 
    { 
     NSString *errorString = NSLocalizedStringFromTable(@"Boolean Property", @"TheObject", @"validation: not YES or NO"); 
     NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:errorString forKey:NSLocalizedDescriptionKey]; 

     NSError *error = [[[NSError alloc] initWithDomain:NSCocoaErrorDomain code:-1 userInfo:userInfoDict] autorelease]; 
     *outError = error; 
     return NO; 
    } 
    return YES; 
}//END 

... nhớ bao gồm tờ khai validateBooleanProperty trong file header. Các phương thức setter và getter lưu trữ và truy xuất thuộc tính của bạn bằng phím - (id) primitiveValueForKey: (NSString *).

Cuối cùng, bạn cần phải gọi một cách rõ ràng phương thức validate từ bất cứ quan điểm điều khiển/app đại biểu bạn đang thiết lập các đối tượng từ:

NSNumber *boolProp = [[[NSNumber alloc] initWithInt :0] autorelease]; 
    NSError *valError = nil;   
    if ([TheObject validateBooleanProperty:&boolProp error:&valError] == YES) 
    { 
     [TheObject setBooleanProperty :boolProp]; 
    }  
1

Sử dụng NSNumber. Không có bool trong khung CoreData.

4

Hãy để Xcode 4.0 quyết định cho bạn. Trong Xcode: chọn một thực thể từ dạng xem tập tin * .xcdatamodel của bạn.
Chọn Trình chỉnh sửa> Tạo phân lớp NSMagedObject ... Xcode khai báo đối tượng Boolean của bạn dưới dạng loại NSNumber.

Chỉnh sửa: Tôi tò mò động lực là gì để giảm thiểu xcdatamodel? Bất kỳ ai?

15

Trong header,

@property (nonatomic, retain) NSNumber *booleanProperty; 

Trong việc thực hiện,

@dynamic booleanProperty; 

Để thiết lập nó là true ...

self.booleanProperty = [NSNumber numberWithBool:YES]; 

Để đặt nó là sai ...

self.booleanProperty = [NSNumber numberWithBool:NO]; 

Để so sánh nó với một boolean true đen: ...

self.booleanProperty.boolValue == YES; 

Để so sánh nó với một boolean false nghĩa đen: ...

self.booleanProperty.boolValue == NO; 

Để biết thêm thông tin: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsnumber_Class/Reference/Reference.html#//apple_ref/occ/clm/NSNumber/numberWithBool:

+1

Hoặc sử dụng viết tắt để gán, tự.booleanProperty = @ (NO); – pojo

+0

Chính xác những gì tôi cần. Cảm ơn bạn đã đi thêm dặm. (Y) –

Các vấn đề liên quan