2010-10-19 3 views
2

У меня есть отношение CoreData, настроенное следующим образом: (извините, я новичок в stackoverflow, поэтому мне нужно нарисовать его с ascii).Отношения CoreData Разъяснение: как эффективно установить обратное отношение


Story (объект)

  • Атрибуты: CreationDate, заказ,

  • Отношения: предложения (один ко многим с Предложением)

Приговор (объект)

  • Атрибуты: образ, порядок, текст

  • Отношения: belongsTo (один к одному с Story)


Примечания:

  • отношения предложения является NSSet
  • отношения belongsTo это история

Проще говоря, история имеет много предложений, но предложение может принадлежать только одной истории.

У меня возникли проблемы с эффективностью установки свойства ownTo - и я знаю, что я немного пропускаю парадигму. Я боюсь, что когда я ставлю свой атрибут, я создам еще один объект Story с его собственным NSSet, создавая рекурсивный цикл обречения. В любом случае, моя проблема, по-видимому, заключается в эффективном определении свойства собственности/отношения каждого предложения.

Код для вставки моих данных в хранилище CoreData выглядит следующим образом:

-(void)addStoryItemAction:(Sentence*)sentence{ 

[self dismissModalViewControllerAnimated:YES]; 
Story *story = [[Story alloc] initWithSentence: sentence]; 

sentence.belongsTo = story; 

//crash and burn here. 

Story *storySetter = (Story*) [NSEntityDescription insertNewObjectForEntityForName:@"Story" inManagedObjectContext:managedObjectContext]; 
[storySetter setSentences:  story.sentences]; 
[storySetter setCreationDate: story.creationDate]; 
[storySetter setOrder:   story.order]; 

NSError *error; 

BOOL isSaved = [managedObjectContext save:&error]; 
NSLog(@"isSaved? %@", (isSaved ? @"YES" :@"NO ")); 

if (!isSaved) { 
    NSLog(@"%@:%s Error saving context: %@", [self class], _cmd, [error localizedDescription]); 
    return; 
} 

}

я получаю следующую ошибку при запуске:

- [приговорить setBelongsTo:] : непризнанный селектор, отправленный в экземпляр 0x5b5aa00

Я знаю, что мне не хватает точки где-то по пути - мог ли кто-то прояснить, где я ошибаюсь, чтобы эффективно реализовать вставку этого набора CoreData?

FYI: Sentence.h:

#import <Foundation/Foundation.h> 
#import "Story.h" 

@class Story; 

@interface Sentence : NSManagedObject { 
} 
@property (assign) NSString *text; 
@property (assign) NSString *image; 
@property (assign) NSInteger *order; 
@property (nonatomic, retain) Story *belongsTo; 

- (id)initWithContent:(NSString*)sentenceText image:(NSString*)sentenceImage order: (NSInteger*)sentencePosition; 
@end 

Sentence.m:

#import "Sentence.h" 
@implementation Sentence 
@synthesize text; 
@synthesize image; 
@synthesize order; 
@dynamic belongsTo; 

- (id)initWithContent:(NSString*)sentenceText image:(NSString*)sentenceImage order: (NSInteger*)sentencePosition{ 
[self setText: sentenceText]; 
[self setImage: sentenceImage]; 
[self setOrder: sentencePosition]; 
return self; 
} 
@end 

история.ч

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 
#import "Sentence.h" 
@class Sentence; 
@interface Story : NSManagedObject { 
} 
@property (assign) NSSet  *sentences; 
@property (assign) NSDate *creationDate; 
@property (assign) NSInteger *order; 

- (id)initWithSentence:(Sentence*)sentence; 
@end 

story.m

#import "Story.h" 
@implementation Story 
@synthesize sentences; 
@synthesize creationDate; 
@synthesize order; 

- (id)initWithSentence: (Sentence*) sentence{ 

NSLog(@"initWithSencence: sentence: %@", sentence); 
sentences = [[NSSet alloc] initWithObjects:sentence, nil]; 
//[sentences setByAddingObject:sentence]; 
[self setSentences:sentences]; 
NSLog(@"sentences (in story object): %@", sentences); 
creationDate = [NSDate date]; 
[self setCreationDate:creationDate]; 
//later expansion, position should be max(position of all stories) ++ 
[self setOrder:0]; 

return self; 
} 

@end 

ответ

1

Я немного запутался, о том, почему вы звоните Alloc/Init на Story непосредственно. Я подозреваю, что если вы делаете то же самое в другом месте вашего кода (который вы должны опубликовать для нас, чтобы заглядывать), то объект «предложение», переданный в addStoryItemAction:, вероятно, НЕ является правильно инициализированным NSManagedObject.

Ошибка, с которой вы сталкиваетесь, означает, что базовый класс неправильно реализовал аксессоры для этого свойства «принадлежит», поэтому, похоже, что-то пошло в ваш код инициализации. Вы должны использовать:

NSEntityDescription *entityFromModel = [[aModel entitiesByName] valueForKey:@"Sentence"]; 
Sentence *sentence = (Sentence *)[[NSManagedObject alloc] initWithEntity:entityFromModel insertIntoManagedObjectContext:context]; 
+0

Привет, я благодарю вас за ответ. У меня не будет возможности опробовать ваш ответ на пару дней, но я с нетерпением жду, если ответ закрепится там, где я ошибаюсь. Тем временем, как вы просили, я добавил дополнительный код - надеюсь, что это немного прояснит ситуацию. Приветствую снова! – glenstorey

+0

От взгляда на файлы реализации вы, безусловно, отсутствуете вызовы инициализатора инициализации NSManagedObject initWithEntity: insertIntoManagedObjectContext. Соответствующим средством (если вы все еще хотели использовать эти обертки) было бы изменить их, чтобы принять аргумент контекста управляемого объекта и вызвать [super initWithEntity: anEntityDescription insertIntoManagedObjectContext: passInContext]. – ImHuntingWabbits

+0

Спасибо IHW, я использовал инструкцию initWithEntity, а не свой собственный инициализатор, и теперь я отлично работаю. Спасибо за Ваш ответ! – glenstorey

Смежные вопросы