Ios 通过一对多关系获取核心数据中的对象

Ios 通过一对多关系获取核心数据中的对象,ios,core-data,Ios,Core Data,我在核心数据中有一对多关系: 每个SBQChrono可以有许多sbqlap 在我的模型中,我有类SBQLap: @interface CILap : NSObject @property (strong, nonatomic) NSDate * lapDate; @end 以及类SBQChrono: @interface CIChrono : NSObject @property (strong, nonatomic) NSDate * startDate; @property (st

我在
核心数据中有一对多
关系

每个
SBQChrono
可以有许多
sbqlap

在我的模型中,我有类
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
实体执行以下操作:

NSFetchRequest *request=[[NSFetchRequest alloc] initWithEntityName:kChronoEntityName];

NSError *error;
NSArray *objects = [appContext.managedObjectContext executeFetchRequest:request error:&error];
如何获取我找到的每个
SBQChrono
实体的指定
SBQLap
entitys?我读了很多帖子,都找不到答案

更新

在尝试转换
NSManagedObject
之后,我意识到laps返回为nil值

做:

用于(对象中的NSManagedObject*oneObject){

} 我得到的信息是:

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'

感谢您将SBQChroo对象添加到阵列中,您需要对其进行强制转换:

SQBChrono *anObject = (SQBChrono *)objects[0];
然后你可以:

anObject.laps;

将为您提供所有关联对象的NSSet吗?

当您将SBQChroo对象添加到数组中时,您将需要对其进行强制转换:

SQBChrono *anObject = (SQBChrono *)objects[0];
然后你可以:

anObject.laps;

将为您提供所有关联对象的NSSet吗?

您的数组对象包含所有SBQChroo对象

通过执行以下操作,可以获取与一个chrono关联的所有SBQLAP:

sqbchroo*myChrono=objects[indexofthedesiredchroo]

然后,计时的圈数在myChrono.laps中,这是SBQLAP的一个集合。可以转换为如下所示的数组:


NSArray*myChronoLaps=[myChrono.laps数组]

您的数组对象包含所有SBQChrono对象

通过执行以下操作,可以获取与一个chrono关联的所有SBQLAP:

sqbchroo*myChrono=objects[indexofthedesiredchroo]

然后,计时的圈数在myChrono.laps中,这是SBQLAP的一个集合。可以转换为如下所示的数组:


NSArray*myChronoLaps=[myChrono.laps数组]

您可以获取与“SBQChrono”有关系的对象

这可以通过两个获取请求完成,首先获取所有“SBQChrono”对象,然后使用谓词对“SBQLap”实体执行第二个请求:

[NSPredicate predicateWithFormat:@"chrono IN %@",objects]

您可以获取与“SBQChrono”有关系的对象

这可以通过两个获取请求完成,首先获取所有“SBQChrono”对象,然后使用谓词对“SBQLap”实体执行第二个请求:

[NSPredicate predicateWithFormat:@"chrono IN %@",objects]

每个
sqbchroo
对象都包含一组与其关联的
SBQLap
对象。查看您的
sqbchroo
属性

@property (strong, nonatomic) NSOrderedSet *laps;
laps
是一个属性,它包含多个
SBQLap
对象到一个
sqbchroo
对象

您可以从集合中获得如下数组:

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);
}

每个
sqbchroo
对象都包含一组与其关联的
SBQLap
对象。查看您的
sqbchroo
属性

@property (strong, nonatomic) NSOrderedSet *laps;
laps
是一个属性,它包含多个
SBQLap
对象到一个
sqbchroo
对象

您可以从集合中获得如下数组:

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);
}

这个问题有很多有趣的答案

答案非常简单,不需要子类化
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的文档。

这方面有很多有趣的答案

答案非常简单,不需要子类化
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的文档。

查看您发布的模型屏幕截图和代码,似乎模型的关系名称设置为
lap
(单数),但您的类定义使用的是
laps
(复数)。核心数据将为
lap
实现访问器,但不理解
laps
,因为它与模型中的名称不匹配。将模型更改为
laps
可以解决此问题。

查看您发布的模型屏幕截图和代码,模型的关系名称似乎设置为
lap
(单数),但您的类定义使用的是
laps
(复数)。核心数据将为
lap
实现访问器,但不理解
laps
,因为它与模型中的名称不匹配。将模型更改为
laps
应该可以解决这个问题。

一个包含
对象中所有计时对象的所有laps的数组基本上是通过访问传感器数据集。CoreData将在您访问它们时透明地获取它们。如果从模型编辑器生成NSManagedObject子类,Xcode将为您生成访问器感谢你在什么阶段首先创造了所有这些物体?您是否创建了任何搭接对象并将其指定给计时关系?我创建了2个实体的关系