2017-07-20 1 views
0

J'essaie d'insérer des données dans une entité en utilisant une relation un à plusieurs. Mon nom d'entité est Student et Detail. Student à Detail ont une relation multiple et Detail à student une relation. Le nom de la relation est detailRelationship de Student à Detail & studentRelationship de Detail à Student.raison: '- [Détail addDetailRelationship:]: sélecteur non reconnu envoyé à l'instance 0x6000000ad740

StudentCoreDataclassProperties

#import "Student+CoreDataClass.h" 


NS_ASSUME_NONNULL_BEGIN 

@interface Student (CoreDataProperties) 

+ (NSFetchRequest<Student *> *)fetchRequest; 

@property (nullable, nonatomic, copy) NSString *number; 
@property (nullable, nonatomic, retain) NSSet<Detail *> *detailRelationship; 

@end 

@interface Student (CoreDataGeneratedAccessors) 

- (void)addStudentRelationshipObject:(Detail *)value; 
- (void)removeStudentRelationshipObject:(Detail *)value; 
- (void)addStudentRelationship:(NSSet<Detail *> *)values; 
- (void)removeStudentRelationship:(NSSet<Detail *> *)values; 

@end 

DetailCoreDataclassProperties

#import "Detail+CoreDataClass.h" 


NS_ASSUME_NONNULL_BEGIN 

@interface Detail (CoreDataProperties) 

+ (NSFetchRequest<Detail *> *)fetchRequest; 

@property (nullable, nonatomic, copy) NSString *name; 
@property (nullable, nonatomic, copy) NSString *address; 
@property (nullable, nonatomic, retain) Student *studentRelationship; 
//@property (nullable, nonatomic, retain) NSSet<Detail *> *studentRelationship; 

@end 

@interface Detail (CoreDataGeneratedAccessors) 

- (void)addDetailRelationshipObject:(Detail *)value; 
- (void)removeDetailRelationshipObject:(Detail *)value; 
- (void)addDetailRelationship:(NSSet<Detail *> *)values; 
- (void)removeDetailRelationship:(NSSet<Detail *> *)values; 

@end 
Code

pour insérer des données

- (IBAction)submit:(id)sender { 
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    _mainContext = [appDelegate manageObjectContext]; 

    Detail *detailtEntity = (Detail *)[NSEntityDescription insertNewObjectForEntityForName:@"Detail" inManagedObjectContext:_mainContext]; 
    _studentClass = (Student *)[NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:_mainContext]; 

    detailtEntity.name = _nameText.text; 
    detailtEntity.address = _addressText.text; 
    detailtEntity.address = _addressText1.text; 
    detailtEntity.name = _nameText1.text; 
    _studentClass.number = _numberText.text; 
    NSMutableSet *mySet = [[NSMutableSet alloc] init]; 
    [mySet addObject: _studentClass]; 
    [detailtEntity addDetailRelationship:mySet];//crash app here 
    detailtEntity.studentRelationship = _studentClass; 

    NSError *error = nil; 
    [_mainContext save:&error]; 

    if (![_mainContext save:&error]) { 
     NSLog(@"error in adding data %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    [self.navigationController popToRootViewControllerAnimated:YES]; 

} 

me montrer l'erreur comme ceci: 'NSInvalidArgumentException', raison: '- [Détail addDetailRelationship:]: sélecteur non reconnu envoyé à exemple 0x6000000ad740'

Répondre

0

Vous envoyez un message avec la signature

- (void)addDetailRelationship:(NSSet<Student *> *)values, 

mais pas de méthode avec la signature qui existe. Au lieu de cela votre signature est

- (void)addDetailRelationship:(NSSet<Detail *> *)values 

(notez le changement de Detail * à Student *. Ainsi, votre application se bloque à l'exception de sélection non reconnu. Je ne sais pas ce que la logique de vous programme, mais vous devez soit créez une méthode avec cette signature ou transmettez les paramètres du type correct

+0

Je suis essayer d'apprendre l'entité multiple et dans ce code essayer d'insérer l'entité de détail dans deux enregistrement et l'entité étudiante dans le lien seul numéro de cet enregistrement deux disponibles dans Détail. Maintenant, vous comprenez ce que M fait? Merci. –

+0

Hey après les modifications me montrent erreur comme ceci: raison: '- [Détail addDetailRelationship:]: sélecteur non reconnu envoyé à l'instance 0x6080000ad7a0' –

0

Les données de base gèrent les relations inverses pour vous: si vous définissez la relation étudiante du détail, les données de base la définiront automatiquement comme l'un des détails des étudiants. besoin du tout pour le qui s'écrase, alors il suffit de supprimer

[detailtEntity addDetailRelationship:mySet];//crash app here 

(La raison de ce plantage est que vous devez ajouterDetailRelationship sur l'étudiant - [_studentClass addDetailRelationship: mySet]. Mais comme je l'ai dit plus haut, vous n'avez pas besoin de la ligne du tout)