我有一个练习应用程序,允许您创建一个锻炼计划,然后创建与该计划相关的个人锻炼。您还可以独立于任何计划创建锻炼。我是Obj-C基础知识的新手,我正在试图弄清楚我应该如何将锻炼与他们的计划联系起来(请记住,最终报告数据将使用两者之间的关系)。
我的结论是,这可以/应该以两种方式之一完成,需要帮助学习哪种方法最有效:
1)创建锻炼时,看看它是来自一个程序还是它自己(这就是我现在成功完成它的方式)。如果它来自程序,则将“WorkoutInProgram”核心数据属性添加到将存储ProgramName的Workout。然后,每当我想要获取程序中的所有锻炼时,我只需查找WorkoutInProgram == ProgramName的属性。
2)在锻炼和程序之间创建某种核心数据关系。在程序中创建Workout时,将存储(Program实体的)ProgramName属性与Workout实体之间的关系。我花了大约一个小时的时间试图弄清楚这种关系,感到困惑,并采取了#1的工作。
我不确定核心数据关系在这里是否有用,我对多个训练与基于ProgramName的单个程序实体相关联这一事实感到困惑。
一如既往,谢谢。
答案 0 :(得分:3)
以下是XCode中应该是什么样子。 Program.workouts是To-Many关系,Workouts.program是可选的To-One关系。
生成的NSManagedObject子类应该如下所示
//
// Program.h
// CoreDataLibraryApp
//
//
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class Workout;
@interface Program : NSManagedObject
@property (nonatomic, retain) NSDate * timeStamp;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSSet *workouts;
@end
@interface Program (CoreDataGeneratedAccessors)
- (void)addWorkoutsObject:(Workout *)value;
- (void)removeWorkoutsObject:(Workout *)value;
- (void)addWorkouts:(NSSet *)values;
- (void)removeWorkouts:(NSSet *)values;
@end
//
// Workout.h
// CoreDataLibraryApp
//
//
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class Program;
@interface Workout : NSManagedObject
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) Program *program;
@end
当您创建新的Workout
时,您可以设置program
属性,如下所示:
newWorkout.program = selectedProgram;
如果你想为一个程序进行所有锻炼,你可以做这样的事情
for (Workout *workout in selectedProgram.workouts) {
NSLog(@" workout is %@", workout.name);
}
答案 1 :(得分:0)
到目前为止您所做的是手动创建自己的关系,您只是没有使用Core Data来管理关系。我建议在Program和Workout之间创建一对多的关系。可以将关系指定为可选,因此不必填充它。
与Core Data指定关系的一些好处包括:如果程序名称发生变化,可以自动保持同步,能够指定删除行为,以及在获取与Workout相关联的程序时的代码简化。
可能导致混淆的一件事(我知道它最初对我有用)是你没有根据特定属性指定关系(就像你在关系数据库中创建模型一样)。例如,您不会为了将两个实体链接在一起而创建特定属性。相反,当您创建关系时,可以将其命名为Workout实体中的“program”和Program实体中的“trainingout”。