2013-08-25 2 views
0

몇 가지 문제의 주위에 내 머리를 점점 많은 관계로 하나가 핵심 데이터 모델에 데이터를 추가하는 데에 하나의 데이터를 추가.많은 핵심 데이터 모델

RecordDate - Relationship: records - One to Many with RecordWorkout. 
RecordWorkout - Relationship: recExercises - One to Many With RecordExercise. 
RecordExercise - Relationship: sets - One to Many With RecordSet. 
RecordSet 

RecordDate는 하나의 문자열 변수에 날짜를 원하는 분야

다음은 내 모델입니다.

RecordWorkout는 하나의 문자열 변수 recWorkoutName을 보유 (날짜의 중복 변수를 저장할 수 없음). (recWorkoutName의 중복 없음 변수가 저장 될 수 없다.)

RecordExercise 단일 변수 recExerciseName 문자열을 보유하고있다. ... (또한 recExerciseName의 중복 변수는 다시 중복 변수는 setLog 변수에 저장 될 수 없다()

레코드 세 개의 문자열 변수 (setLog, 무게, 담당자를 보유하고 저장되지 코드의

목표 수 있습니다

목적이 버튼을 클릭하면 버튼 클릭 (버튼 로그)이다, 코드가 너무 중복 값이 ​​저장되지 않습니다 데이터 저장소에 이미 값으로 화면에 값을 비교해야

예. :

날짜> workoutName> 운동> (많은 세트 예컨대 : SET1, SET2, SET3, SET4) 버튼 날짜의 첫 번째 클릭에서

, workoutName exerciseName 첫 번째 세트의 세부 사항이 저장됩니다. 두 번째 클릭시 새 설정 데이터 만 저장됩니다. 다음은

내가 사용하고있는 코드이지만, 모든 설정 값을 저장하지 않는 것, 일부 세트는 데이터 저장소에서 놓친 얻을하거나 첫 세트가 저장된다.
setCount = setCount + 1; 
NSString *weight = weightTextField.text; 
NSString *reps = repsTextField.text; 


NSString *setStr = [NSString stringWithFormat:@"%d", (int)setCount]; 

NSMutableString *log = [NSMutableString stringWithFormat:@"%@ %@%@ %@ %@ %@ %@", @"Set", setStr, @":", weight, @"kg X", reps, @"reps"]; 
[self.tempLog addObject:log]; 
[self.myTableView reloadData]; 
[weightTextField resignFirstResponder]; 
[repsTextField resignFirstResponder]; 
//the set is stored in a temporary mutable array (tempLog) just to show in tableview 
//i would rather just store it in the actual entity and fetch from there 

//Entities are initialised below 
NSEntityDescription *recordDateEntity = [NSEntityDescription entityForName:@"RecordDate" 
                inManagedObjectContext:self.managedObjectContext]; 

NSEntityDescription *recordWorkoutEntity = [NSEntityDescription entityForName:@"RecordWorkout" 
                 inManagedObjectContext:self.managedObjectContext]; 

NSEntityDescription *recordExerciseEntity = [NSEntityDescription entityForName:@"RecordExercise" 
                 inManagedObjectContext:self.managedObjectContext]; 

NSEntityDescription *recordSetEntity = [NSEntityDescription entityForName:@"RecordSet" inManagedObjectContext:self.managedObjectContext]; 

//Data is fetched from the existing store to be compared with the data on screen 
//This data is stored in mutable arrays (record date, recordworkouts, recordexercises, recordsets) 
NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"RecordDate"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"date == %@", dateLabel.text]; 
[fetchRequest setPredicate:predicate]; 
self.recorddates = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 

NSFetchRequest *fetchRWRequest = [[NSFetchRequest alloc] initWithEntityName:@"RecordWorkout"]; 
NSPredicate *predicateRW = [NSPredicate predicateWithFormat:@"recWorkoutName == %@", testLabel2.text]; 
[fetchRWRequest setPredicate:predicateRW]; 
self.recordworkouts = [[managedObjectContext executeFetchRequest:fetchRWRequest error:nil] mutableCopy]; 

NSFetchRequest *fetchRERequest = [[NSFetchRequest alloc] initWithEntityName:@"RecordExercise"]; 
NSPredicate *predicateRE = [NSPredicate predicateWithFormat:@"recExerciseName == %@", exNameLabel.text]; 
[fetchRERequest setPredicate:predicateRE]; 
self.recordexercises = [[managedObjectContext executeFetchRequest:fetchRERequest error:nil] mutableCopy]; 

NSFetchRequest *fetchRSetRequest = [[NSFetchRequest alloc] initWithEntityName:@"RecordSet"]; 
NSPredicate *predicateRSet = [NSPredicate predicateWithFormat:@"setLog == %@", setStr]; 
[fetchRSetRequest setPredicate:predicateRSet]; 
self.recordsets = [[managedObjectContext executeFetchRequest:fetchRSetRequest error:nil] mutableCopy]; 

if ([self.recorddates count] == 0) { 

    NSLog(@"No Dates Imported"); 

    RecordDate *newRecordDate = (RecordDate *)[[NSManagedObject alloc] 
               initWithEntity:recordDateEntity 
               insertIntoManagedObjectContext:self.managedObjectContext]; 
    newRecordDate.date = dateLabel.text; 

    RecordWorkout *newRecordWorkout = (RecordWorkout *)[[NSManagedObject alloc] 
                 initWithEntity:recordWorkoutEntity 
                 insertIntoManagedObjectContext:self.managedObjectContext]; 

    newRecordWorkout.recWorkoutName = testLabel2.text; 
    [newRecordDate addRecordsObject:newRecordWorkout]; 

    RecordExercise *newRecordExercise = (RecordExercise *)[[NSManagedObject alloc] initWithEntity:recordExerciseEntity insertIntoManagedObjectContext:self.managedObjectContext]; 

    newRecordExercise.recExerciseName = exNameLabel.text; 
    [newRecordWorkout addRecExercisesObject:newRecordExercise]; 



    RecordSet *newRecordSet = (RecordSet *)[[NSManagedObject alloc] 
              initWithEntity:recordSetEntity 
              insertIntoManagedObjectContext:self.managedObjectContext]; 

    newRecordSet.setLog = setStr; 
    newRecordSet.weight = weight; 
    newRecordSet.reps = reps; 
    [newRecordExercise addSetsObject:newRecordSet]; 

    NSLog(@"Set number one should be added to model: %@", setStr); 

} else { 

    NSLog(@"Dates Are Imported"); 

    RecordDate *prevRecordDate = (RecordDate *)[self.recorddates objectAtIndex:0]; 

    if ([self.recordworkouts count] == 0) { 

     RecordWorkout *newRecordWorkout = (RecordWorkout *)[[NSManagedObject alloc] 
                  initWithEntity:recordWorkoutEntity 
                  insertIntoManagedObjectContext:self.managedObjectContext]; 
     newRecordWorkout.recWorkoutName = testLabel2.text; 
     [prevRecordDate addRecordsObject:newRecordWorkout]; 

     RecordExercise *newRecordExercise = (RecordExercise *)[[NSManagedObject alloc] initWithEntity:recordExerciseEntity insertIntoManagedObjectContext:self.managedObjectContext]; 

     newRecordExercise.recExerciseName = exNameLabel.text; 
     [newRecordWorkout addRecExercisesObject:newRecordExercise]; 

     RecordSet *newRecordSet = (RecordSet *)[[NSManagedObject alloc] 
               initWithEntity:recordSetEntity 
               insertIntoManagedObjectContext:self.managedObjectContext]; 

     newRecordSet.setLog = setStr; 
     newRecordSet.weight = weight; 
     newRecordSet.reps = reps; 
     [newRecordExercise addSetsObject:newRecordSet]; 

    } else { 

     RecordWorkout *prevRecordWorkout = [self.recordworkouts objectAtIndex:0]; 


     if ([self.recordexercises count] == 0) { 

      RecordExercise *newRecordExercise = (RecordExercise *)[[NSManagedObject alloc] initWithEntity:recordExerciseEntity insertIntoManagedObjectContext:self.managedObjectContext]; 


      newRecordExercise.recExerciseName = exNameLabel.text; 
      [prevRecordWorkout addRecExercisesObject:newRecordExercise]; 

      RecordSet *newRecordSet = (RecordSet *)[[NSManagedObject alloc] 
                initWithEntity:recordSetEntity 
                insertIntoManagedObjectContext:self.managedObjectContext]; 

      newRecordSet.setLog = setStr; 
      newRecordSet.weight = weight; 
      newRecordSet.reps = reps; 
      [newRecordExercise addSetsObject:newRecordSet]; 

     } else { 

      RecordExercise *prevRecordExercise = [self.recordexercises objectAtIndex:0]; 

      if ([self.recordsets count] == 0) { 

       RecordSet *newRecordSet = (RecordSet *)[[NSManagedObject alloc] 
                 initWithEntity:recordSetEntity 
                 insertIntoManagedObjectContext:self.managedObjectContext]; 

       newRecordSet.setLog = setStr; 
       newRecordSet.weight = weight; 
       newRecordSet.reps = reps; 
       [prevRecordExercise addSetsObject:newRecordSet]; 

      } else { 

       NSLog(@"Sets Already Imported"); 
      } 
     } 
    } 

    NSError *errr; 
    if (![self.managedObjectContext save:&errr]) 
    { 
     NSLog(@"Error saving context: %@", errr); 
    } 
} 

나는 내가 훨씬 더 나은 조직 코드를 사용 후 나는 무엇을 달성 할 수있는 느낌을 받았습니다.

도움을 주셔서 감사합니다.

ps. 위의 코드는 그것은 훨씬 더 간단 할 수 logButtonPressed 방법

+0

작동하지 않는 기능은 무엇입니까? – Mundi

+0

모든 설정 값을 저장하지 않습니다. 예를 들어 1 - 10에서 10 세트를 저장하는 경우입니다. 일부 설정 값은 저장되지 않습니다. – user2512523

답변

1

입니다. 페치

1), 그냥 날짜를 가져오고 코어 데이터가 다른 물건을 가져 오는 돌볼 수 있도록하기에 충분하다. 훨씬 더 효율적이고 훨씬 적은 코드.

NSSet *workouts = date.workouts; 
NSSet *exercises = aWorkout.exercises; 
NSSet *sets = anExercise.sets; 

2) 항목이 존재하는 경우, 예를 들어, 확인하는 경우 : 관련 기관 "가져 오기"를

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Date"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat: 
     @"%K = %@", attributeName, theDateStringToBeChecked]; 
request.fetchLimit = 1; 
NSArray *dates = [self.managedObjectContext executeFetchRequest:request]; 
NSManagedObject *objectToUse = dates.count ? dates[0] : [NSEntityDescription 
    insertNewObjectForEntityName:"Date" 
    inManagedObjectContext:self.managedObjectContext]; 

당신은 크게 기업 문자열 속성 문자열과 확인하는 값을 사용하는 방법을 구성하여 코드를 줄일 수 : 날짜는이 패턴을 따릅니다. 당신의 목적은 당신이 단순히 권리 유형에 캐스팅 할 수 NSManagedObject의 서브 클래스이기 때문에

-(NSManagedObject*)existingOrNewObjectWithEntityName:(NSString*)name 
     attribute:(NSString*)attribute value:(NSString*)value; 

: 그것은이 같은 프로토 타입을 가질 것이다.

마지막으로 [self.managedObjectContext save:&error];으로 전화하여 변경 사항을 유지해야합니다.

+0

이것이 작동 할 수 있는지 확실하지 않습니다. 처음에는 저장된 날짜가 없습니다. 따라서 NSSets 내에서 설정된 관계가 없습니다. – user2512523

+0

논리적이지 않습니다. 어떻게 날짜없이 운동을합니까? 그래도 운동을 가져 와서 같은 방식으로 체인을 내려가 시작할 수 있습니다. – Mundi

+0

핵심 데이터 모델에는 두 가지 데이터 집합이 있습니다. 운동 자료 및 기록 자료. 운동 데이터는 레코드 데이터와 별개입니다. 레코드 데이터는 위에서 설명한 네 개의 엔티티로 구성됩니다. RecordDate는 날짜 만 보유합니다. RecordWorkout은 운동 데이터에서 가져온 운동 이름 만 보유합니다. RecordExercise에는 운동 이름 만 있습니다. RecordSet은 설정된 데이터를 보유합니다. Set : 1 Reps : 3 etc. – user2512523

관련 문제