#iphone #objective-c #core-data
#iPhone #objective-c #core-data
Вопрос:
У меня есть объект «Routine», имеющий отношение «ко многим» к «упражнению», называемому «routineExercises».
У меня есть вызываемый метод addExercise
, который должен добавить упражнение к экземпляру Routine.
Это правильный способ реализовать это в коде?
Exercise *exercise = (Exercise *)[NSEntityDescription insertNewObjectForEntityForName:@"Exercise" inManagedObjectContext:managedObjectContext];
exercise.name = selectedExercise;
NSMutableSet *exercises = [[NSMutableSet alloc]init];
[exercises addObject:exercise];
Routine *routine = [NSEntityDescription insertNewObjectForEntityForName:@"Routine" inManagedObjectContext:managedObjectContext];
routine.routineExercises = exercises;
Обновление: я получаю сообщение об ошибке в routine.routineExercises = exercises, в котором говорится «-[Routine setRoutineExercises:]: нераспознанный селектор, отправленный в экземпляр 0x711bf30
2011-04-27 01:25:37.683 Curl [888:207] *** Завершение работы приложения из-за неперехваченного исключения ‘NSInvalidArgumentException’, причина: ‘-[Обычные setRoutineExercises:]: нераспознанный селектор, отправленный в экземпляр 0x711bf30’
«
Обновить:
-(void)addExercise
{
if (managedObjectContext == nil)
{
managedObjectContext = [(CurlAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
[managedObjectContext retain];
}
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Exercise" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:amp;error] mutableCopy];
if (mutableFetchResults == nil) {
// Handle the error.
}
Exercise *exercise = (Exercise *)[NSEntityDescription insertNewObjectForEntityForName:@"Exercise" inManagedObjectContext:managedObjectContext];
exercise.name = selectedExercise;
NSMutableSet *exercises = [NSSet setWithObjects:exercise,nil];
Routine *routine = (Routine *)[NSEntityDescription insertNewObjectForEntityForName:@"Routine" inManagedObjectContext:managedObjectContext];
routine.routineExercises = exercises;
if (![managedObjectContext save:amp;error])
{
// Handle the error.
}
NSLog(@"%@", error);
[self.routineTableView reloadData];
[mutableFetchResults release];
[request release];
}
Ошибка:
2011-04-27 03:05:58.902 Curl[1954:207] -[Routine setRoutineExercises:]: unrecognized selector sent to instance 0x5d4a4e0
2011-04-27 03:05:58.904 Curl[1954:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Routine setRoutineExercises:]: unrecognized selector sent to instance 0x5d4a4e0'
Routine.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class Exercise;
@interface Routine : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSDate * timeStamp;
@property (nonatomic, retain) NSSet* routineExercises;
@end
Routine.m
#import "Routine.h"
#import "Exercise.h"
@implementation Routine
@dynamic name;
@dynamic timeStamp;
@dynamic routineExercises;
- (void)addRoutineExercisesObject:(Exercise *)value {
NSSet *changedObjects = [[NSSet alloc] initWithObjects:amp;value count:1];
[self willChangeValueForKey:@"routineExercises" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[[self primitiveValueForKey:@"routineExercises"] addObject:value];
[self didChangeValueForKey:@"routineExercises" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[changedObjects release];
}
- (void)removeRoutineExercisesObject:(Exercise *)value {
NSSet *changedObjects = [[NSSet alloc] initWithObjects:amp;value count:1];
[self willChangeValueForKey:@"routineExercises" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
[[self primitiveValueForKey:@"routineExercises"] removeObject:value];
[self didChangeValueForKey:@"routineExercises" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
[changedObjects release];
}
- (void)addRoutineExercises:(NSSet *)value {
[self willChangeValueForKey:@"routineExercises" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
[[self primitiveValueForKey:@"routineExercises"] unionSet:value];
[self didChangeValueForKey:@"routineExercises" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
}
- (void)removeRoutineExercises:(NSSet *)value {
[self willChangeValueForKey:@"routineExercises" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
[[self primitiveValueForKey:@"routineExercises"] minusSet:value];
[self didChangeValueForKey:@"routineExercises" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
}
@end
Ответ №1:
Вам не хватает приведения к подпрограмме *.
Изменить
Routine *routine = [NSEntityDescription insertNewObjectForEntityForName:@"Routine" inManagedObjectContext:managedObjectContext];
Для
Routine *routine = (Routine *)[NSEntityDescription insertNewObjectForEntityForName:@"Routine" inManagedObjectContext:managedObjectContext];
Комментарии:
1. Спасибо! Я думаю, мне нужно добавить строку что-то вроде
NSMutableSet *exercises = [exercise mutableSetValueForKey:@"name"];
?2. Это предоставит вам доступ для чтения и записи к неупорядоченной связи «многим» и предоставит вам необходимую вам связь / несвязанность. Вы также могли бы сделать
NSSet *exercises = [NSSet setWithObjects:exercise,nil];
, а затем сохранить свойroutine.routineExercises = exercises;
таким же. Сейчас он не сохраняется?3. Я использовал код, который вы только что добавили, но теперь я получаю сообщение об ошибке
exercises addObject:exercise
, в котором говорится *** Завершение работы приложения из-за неперехваченного исключения ‘NSInternalInconsistencyException’, причина: ‘-[__NSCFSet AddObject:]: метод изменения, отправленный в неизменяемый объект’ . Я думаю, что в классах сущностей взаимосвязь представляет собой NSSet, а не NSMutableSet.4. Если вы используете мой код, вам не нужно будет вызывать
[exercises addObject:exercise];
, поскольку объект exercise уже добавлен в NSSet exercises при создании экземпляра.5. Вот ссылка на CoreData, прокрутите вниз до раздела «Отношения ко многим» для получения дополнительной информации. ……….