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个实体的关系