iOS我应该使用核心数据吗?

时间:2014-01-11 04:32:26

标签: ios core-data

我有一个练习应用程序,允许您创建一个锻炼计划,然后创建与该计划相关的个人锻炼。您还可以独立于任何计划创建锻炼。我是Obj-C基础知识的新手,我正在试图弄清楚我应该如何将锻炼与他们的计划联系起来(请记住,最终报告数据将使用两者之间的关系)。

我的结论是,这可以/应该以两种方式之一完成,需要帮助学习哪种方法最有效:

1)创建锻炼时,看看它是来自一个程序还是它自己(这就是我现在成功完成它的方式)。如果它来自程序,则将“WorkoutInProgram”核心数据属性添加到将存储ProgramName的Workout。然后,每当我想要获取程序中的所有锻炼时,我只需查找WorkoutInProgram == ProgramName的属性。

2)在锻炼和程序之间创建某种核心数据关系。在程序中创建Workout时,将存储(Program实体的)ProgramName属性与Workout实体之间的关系。我花了大约一个小时的时间试图弄清楚这种关系,感到困惑,并采取了#1的工作。

我不确定核心数据关系在这里是否有用,我对多个训练与基于ProgramName的单个程序实体相关联这一事实感到困惑。

一如既往,谢谢。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

到目前为止您所做的是手动创建自己的关系,您只是没有使用Core Data来管理关系。我建议在Program和Workout之间创建一对多的关系。可以将关系指定为可选,因此不必填充它。

与Core Data指定关系的一些好处包括:如果程序名称发生变化,可以自动保持同步,能够指定删除行为,以及在获取与Workout相关联的程序时的代码简化。

可能导致混淆的一件事(我知道它最初对我有用)是你没有根据特定属性指定关系(就像你在关系数据库中创建模型一样)。例如,您不会为了将两个实体链接在一起而创建特定属性。相反,当您创建关系时,可以将其命名为Workout实体中的“program”和Program实体中的“trainingout”。