通过一对多关系获取Core Data中的对象

时间:2014-01-28 13:47:27

标签: ios core-data

我在One-to-Many中有relationship Core Data

enter image description here

每个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'

由于

6 个答案:

答案 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可以解决该问题。