2013-04-13 30 views
6

Không chắc chắn tôi đang làm gì sai ở đây.Lỗi thêm nhiều lỗi CoreData

Trường học có nhiều sinh viên và Sinh viên có tính nghịch đảo của nó. enter image description here


enter image description here


Một mã kiểm tra ít như sau:

@class Student; 

@interface School : NSManagedObject 

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSOrderedSet *students; 
@end 

@interface School (CoreDataGeneratedAccessors) 

- (void)insertObject:(Student *)value inStudentsAtIndex:(NSUInteger)idx; 
- (void)removeObjectFromStudentsAtIndex:(NSUInteger)idx; 
- (void)insertStudents:(NSArray *)value atIndexes:(NSIndexSet *)indexes; 
- (void)removeStudentsAtIndexes:(NSIndexSet *)indexes; 
- (void)replaceObjectInStudentsAtIndex:(NSUInteger)idx withObject:(Student *)value; 
- (void)replaceStudentsAtIndexes:(NSIndexSet *)indexes withStudents:(NSArray *)values; 
- (void)addStudentsObject:(Student *)value; 
- (void)removeStudentsObject:(Student *)value; 
- (void)addStudents:(NSOrderedSet *)values; 
- (void)removeStudents:(NSOrderedSet *)values; 
@end 



// Meanwhile, elsewhere... 
-(void)go { 
    AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *context = [app managedObjectContext]; 

    School *school = (School *)[NSEntityDescription insertNewObjectForEntityForName:@"School" inManagedObjectContext:context]; 
    [school setName:@"Stanford"]; 

    Student *student = (Student *)[NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context]; 
    [student setName:@"Eric"]; 


    //[school addStudentsObject:student]; 

    NSMutableSet *students = [school mutableSetValueForKey:@"students"]; 
    [students addObject:student]; 


    NSError *__autoreleasing error; 
    BOOL success = [context save:&error]; 

    if (!success) { 
     @throw [NSException exceptionWithName:NSGenericException 
            reason:[error description] 
            userInfo:nil]; 
    } 
} 

Sử dụng nhận xét addStudentsObject: không thành công với:

2013-04-13 16:22:58.648 CDTMTest[2098:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSSet intersectsSet:]: set argument is not an NSSet' 
*** First throw call stack: 
(0x1fa2012 0x13dfe7e 0x2030a4a 0xb85ec6 0xb087f9 0xb85d33 0x11aa638 0x7ee2069 0x2b4d 0xacd5b3 0x1f61376 0x1f60e06 0x1f48a82 0x1f47f44 0x1f47e1b 0x1efc7e3 0x1efc668 0x13ffc 0x1bdd 0x1b05) 
libc++abi.dylib: terminate called throwing an exception 

Sử dụng mutableSetValueForKey: không thành công với

2013-04-13 16:07:05.111 CDTMTest[2012:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'NSManagedObjects of entity 'School' do not support -mutableSetValueForKey: for the property 'students'' 
*** First throw call stack: 
(0x1fa3012 0x13e0e7e 0x11370da 0x3af3 0xace5b3 0x1f62376 0x1f61e06 0x1f49a82 0x1f48f44 0x1f48e1b 0x1efd7e3 0x1efd668 0x14ffc 0x2b7d 0x2aa5) 
libc++abi.dylib: terminate called throwing an exception 
+0

này có thể chỉ là một lỗi đánh máy, nhưng tôi đang bối rối: Bạn đề cập đến: "Các nhận xét 'setStudentsObject'" đang gây ra lỗi. Nhưng trong văn bản câu hỏi của bạn, dòng nhận xét là 'addStudentsObject'. Đó có phải chỉ là lỗi đánh máy trong câu hỏi của bạn hay là điều gì gây ra lỗi? –

+0

@Anthony: đó là lỗi đánh máy. 'add ~' là chính xác, cố định. Cảm ơn! – QED

+3

có thể trùng lặp của [Ngoại lệ được ném trong NSOrderedSet tạo accessors] (http://stackoverflow.com/questions/7385439/exception-thrown-in-nsorderedset-generated-accessors) –

Trả lời

8

Bạn có thể muốn thử điều này cho thêm vào một tập:

mutableOrderedSetValueForKey: 

Như bạn đã chọn bạn tới nhiều mối quan hệ với Được ra lệnh. nhưng tôi tin rằng nó sẽ được dễ dàng hơn để bạn có thể chỉ cần đặt mối quan hệ theo cách khác:

student.school = school; 
+0

Đây là những gì tôi đang làm trong thời gian này, và nó duy trì thứ tự đúng cách. Nhưng tôi vẫn không biết tại sao phương thức add sẽ không hoạt động, hoặc tại sao nó chưa xuất hiện ở đây trên SO. Nó làm cho tôi nghĩ rằng tôi đang thiếu một cái gì đó. – QED

+1

Nó đã xuất hiện: http: // stackoverflow.com/questions/7385439/ngoại lệ-ném-in-nsorderedset tạo ra-accessors. –

2

Tôi đã có một vấn đề tương tự. Tôi đọc ở đâu đó rằng việc triển khai dữ liệu lõi cơ bản cho nhiều mối quan hệ không hoạt động chính xác mọi lúc. Nó có một cái gì đó để làm với mối quan hệ chỉ chấp nhận một nsset và setters tạo ra không đúng cách chuyển đổi các đối số đến một nsset. Để khắc phục nó thử trọng các addStudentsObject: phương pháp với một cái gì đó như thế này:

static NSString *const kItemsKey = @"students"; 

- (void)addStudentsObject:(Student *)value { 
    NSMutableSet* tempSet = [NSMutableSet setWithSet:self.students]; 
    NSSet* newObject = [NSSet setWithObject:value]; 
    [self willChangeValueForKey:kItemsKey withSetMutation:NSKeyValueUnionSetMutation usingObjects:newObject]; 
    [tempSet addObject:value]; 
    self.students = tempSet; 
    [self didChangeValueForKey:kItemsKey withSetMutation:NSKeyValueUnionSetMutation usingObjects:newObject]; 
} 
+0

Tôi sẽ thử tính năng này khi có thời gian rảnh. Nếu bạn có thể tìm ra nơi mà nó là bạn đọc đó, xin vui lòng làm đăng một liên kết. Cảm ơn mã! – QED

+0

Thực ra, hãy nghĩ về nó - đó là trong tài liệu CoreData ... – QED

+0

Bạn có thực sự cần một mối quan hệ * đặt hàng * không? Vấn đề không xảy ra với các mối quan hệ không có thứ tự. –

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