У меня есть отношение 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
Привет, я благодарю вас за ответ. У меня не будет возможности опробовать ваш ответ на пару дней, но я с нетерпением жду, если ответ закрепится там, где я ошибаюсь. Тем временем, как вы просили, я добавил дополнительный код - надеюсь, что это немного прояснит ситуацию. Приветствую снова! – glenstorey
От взгляда на файлы реализации вы, безусловно, отсутствуете вызовы инициализатора инициализации NSManagedObject initWithEntity: insertIntoManagedObjectContext. Соответствующим средством (если вы все еще хотели использовать эти обертки) было бы изменить их, чтобы принять аргумент контекста управляемого объекта и вызвать [super initWithEntity: anEntityDescription insertIntoManagedObjectContext: passInContext]. – ImHuntingWabbits
Спасибо IHW, я использовал инструкцию initWithEntity, а не свой собственный инициализатор, и теперь я отлично работаю. Спасибо за Ваш ответ! – glenstorey