我在One-to-Many
中有relationship
Core Data
:
每个SBQChrono
可以有多个SBQLaps
。
在我的模型中,我有班级SBQLap
:
@interface CILap : NSObject
@property (strong, nonatomic) NSDate * lapDate;
@end
班级SBQChrono
:
@interface CIChrono : NSObject
@property (strong, nonatomic) NSDate * startDate;
@property (strong, nonatomic) NSDate * stopDate;
@property (strong, nonatomic) NSOrderedSet *laps;
@end
我得到了所有SBQChrono
entities
:
NSFetchRequest *request=[[NSFetchRequest alloc] initWithEntityName:kChronoEntityName];
NSError *error;
NSArray *objects = [appContext.managedObjectContext executeFetchRequest:request error:&error];
如何找到每个SBQLap
找到的指定SBQChrono
个实体?我读了很多帖子,但无法得到解决方案。
更新:
在尝试施放NSManagedObject
之后,我意识到圈数以零值返回。
这样做的:
for(NSManagedObject *对象中的oneObject){
CIChrono *chrono=(CIChrono *)oneObject;
NSLog(@"startDate %@", chrono.startDate);
NSLog(@"stopDate %@", chrono.stopDate);
NSLog(@"laps %@",chrono.laps);
} 我收到了消息:
2014-01-28 14:39:48.379 Chrono[2341:70b] startDate 2014-01-28 12:27:53 +0000
2014-01-28 14:39:48.380 Chrono[2341:70b] stopDate 2014-01-28 12:27:54 +0000
2014-01-28 14:39:48.380 Chrono[2341:70b] -[NSManagedObject laps]: unrecognized selector sent to instance 0x8b959b0
2014-01-28 14:39:48.383 Chrono[2341:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSManagedObject laps]: unrecognized selector sent to instance 0x8b959b0'
由于
答案 0 :(得分:6)
关于这一个的很多有趣的答案。
答案非常简单,不需要子类化NSManagedObject
来访问关系中的对象。您只需使用KVC(键值编码)来访问这些对象。关系和属性都是如此。
如果你想使用合成方法,你可以通过子类化来暗示,但这不是必需的。
以下是您在问题中发布的示例的扩展名:
for (NSManagedObject *oneObject in objects) {
CIChrono *chrono=(CIChrono *)oneObject;
NSLog(@"startDate %@", [chrono valueForKey:@"startDate");
NSLog(@"stopDate %@", [chrono valueForKey:@"stopDate"]);
NSLog(@"laps %@", [chrono valueForKey:@"laps"]);
NSSet *laps = [chrono valueForKey:@"laps"];
for (NSManagedObject *lap in laps) {
NSLog(@"Lap entity: %@", lap);
}
}
请注意-valueForKey:
来电。这些是NSManagedObject
实例(以及所有其他Objective-C对象)响应的键值编码。我建议阅读关于KVC和KVO的文档。
答案 1 :(得分:2)
每个SQBChrono
对象都包含一组与之关联的SBQLap
个对象。查看您的SQBChrono
属性
@property (strong, nonatomic) NSOrderedSet *laps;
laps
是一个包含许多SBQLap
个对象到一个SQBChrono
对象的属性。
你可以从这个集合中获取一个数组:
NSFetchRequest *request=[[NSFetchRequest alloc] initWithEntityName:kChronoEntityName];
NSError *error;
NSArray *chronoObjectArray = [appContext.managedObjectContext executeFetchRequest:request error:&error];
for (SQBChrono * chrono in chronoObjectArray) {
NSArray *lapsArray = [chrono.laps array];
NSLog("Chrono: %@ laps: %@", chrono.startDate, lapsArray);
}
答案 2 :(得分:0)
当您将SBQChrono对象添加到数组时,您需要将其转换为:
SQBChrono *anObject = (SQBChrono *)objects[0];
然后你可以:
anObject.laps;
会给你所有相关对象的NSSet吗?
答案 3 :(得分:0)
您的数组对象包含所有SBQChrono对象。
您可以通过执行以下操作获取与一个计时器关联的所有SBQLaps:
SQBChrono * myChrono = objects[indexOfTheDesiredChrono];
计时器的圈数是myChrono.laps,它是SBQLaps的NSOrderedSet(集合)。可以变成这样的数组:
NSArray * myChronoLaps = [myChrono.laps array]
答案 4 :(得分:0)
您可以获取与“SBQChrono”有关系的对象。
这可以通过两个获取请求完成,首先获取所有'SBQChrono'对象&然后对带有谓词的'SBQLap'实体执行第二次请求:
[NSPredicate predicateWithFormat:@"chrono IN %@",objects]
答案 5 :(得分:0)
查看您发布的模型屏幕截图和代码,似乎模型的关系名称设置为lap
(单数),但您的类定义使用laps
(复数)。核心数据将实现lap
的访问者,但不理解laps
,因为它与模型中的名称不匹配。将模型更改为laps
可以解决该问题。