【发布时间】:2023-03-26 04:45:01
【问题描述】:
我有一个 CoreData 关系设置如下: (对不起,我是 stackoverflow 的新手,所以我必须用 ascii 来绘制它)。
故事(对象)
属性: 创立日期, 顺序,
关系: 句子(用句子一对多)
句子(对象)
属性:图片、顺序、文字
关系:belongsTo(与 Story 一对一)
注意事项:
- 句子关系是一个 NSSet
- belongsTo 关系是一个故事
简单来说,一个 Story 有很多 Sentence,但一个 Sentence 只能属于一个 Story。
我在有效设置 belongsTo 属性时遇到了麻烦 - 我知道我有点错过了范式。恐怕当我设置 belongsTo 时,我会用它自己的 NSSet 创建另一个 Story 对象,从而创建一个厄运的递归循环。无论如何,我的问题似乎是有效地设置了每个句子的 belongsTo 属性/关系。
将我的数据插入 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;
}
}
运行时出现以下错误:
-[Sentence setBelongsTo:]:无法识别的选择器发送到实例 0x5b5aa00
我知道我在路上的某个地方遗漏了要点 - 有人可以澄清我哪里出错了,以便我可以有效地实现这个 CoreData 集的插入吗?
仅供参考: 句子.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
句子.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
故事.h
#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
故事.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
【问题讨论】:
标签: iphone objective-c cocoa-touch core-data