2014-01-11 206 views
0

我有一个运动应用程序,允许你创建一个锻炼计划,然后创建与计划相关的个人训练。您还可以创建独立于任何程序的锻炼。我是Obj-C基础知识的新手,并试图弄清楚我应该如何配合他们的计划进行锻炼(请记住,最终报告数据将使用两者之间的关系)。iOS我应该使用核心数据?

我已经得出结论,这可/应在1 2的方式完成,需要帮助的学习是最有效的:

1)当创建一个锻炼,看看它从一个程序或起源是独立的(这是我现在成功完成的)。如果它来自程序,请将“WorkoutInProgram”核心数据属性添加到将存储ProgramName的锻炼中。然后,无论何时我想要在程序中获取所有锻炼,我只需查找WorkoutInProgram == ProgramName的属性即可。

2)在锻炼和程序之间创建某种核心数据关系。在程序中创建锻炼时,会存储ProgramName属性(程序实体的)和锻炼实体之间的关系。我花了大约一个小时的时间试图找出这种关系,感到困惑,并采取了一个有效的#1。

我不确定这里的核心数据关系是否有用,但我挂断了多个Workouts会与基于ProgramName的单个Program实体关联的事实。

与往常一样,谢谢你。

回答

3

这里大概是XCode中应该看起来像什么东西。 Program.workouts是一个To-Many关系,Workouts.program是一个可选的To-One关系。

Program Entity Workout entity

生成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); 
} 
+0

工程就像一个魅力,感谢您花时间!帮助我理解CD,建立这种关系比我想象的要容易得多。关于像addWorkoutsObject等添加的方法的一个问题... 正在利用这些只是从程序添加/删除锻炼的更短的方式?现在,我只需通过programName获取Program对象,然后在创建锻炼时添加'newWorkout.program = selectedProgram',就可以将锻炼添加到程序中......我没有看到在哪里使用这些方法。 – Paul

+0

这些子类和方法是由xCode自动生成的,我不使用它们。只需使用=赋值。 –

+0

要生成一个子类,请使用File-> New,然后选择NSManagedSubclass并从您的模型中选择类。 –

0

到目前为止,您所做的工作是手动创建您自己的关系,您只是没有使用核心数据来管理关系。我建议在程序和锻炼之间建立一对多的关系。该关系可以指定为可选,因此不必填充。

与Core Data指定的关系有一些好处,包括自动保持同步,如果程序的名称发生变化,能够指定删除行为和代码简化提取与锻炼相关的程序。

有一件事可能会引起混淆(我知道它起初对我而言)是因为您没有根据特定属性指定关系(就像您在关系数据库中创建模型一样)。例如,您不会为了将两个实体链接在一起而创建特定的属性。相反,当您创建您的关系时,您可以在锻炼实体中将其命名为“程序”,并在程序实体中将其命名为“锻炼”。