2011-03-11 4 views
1

여기 핵심 데이터 Noob.여러 데이터에 코어 데이터 저장 및로드

프로젝트가있어서 데이터를 단일 엔티티에 저장할 때 아무런 문제가 없습니다. 그러나 엔터티가 너무 많은 속성 (100 이상)을 가지고 있기 때문에 정규화해야한다는 경고가 표시됩니다. 좋아, 그래서 두 번째 엔티티를 만들어 To-One 관계로 더 많은 데이터를 저장한다.

데이터를 저장하려고하면 데이터가 저장되고 첫 번째 엔티티로 다시로드되지만 두 번째 엔티티는 저장되거나 다시로드되지 않습니다. 나는 간단한 것을 놓치고 있어야합니다. 첫째, 나는 100 개 속성을 가진 엔티티의 필요성을 본 적이 있기 때문에 당신이 여기 개념에 문제가 있다고 생각

//ViewDidLoad 
    - (void)viewDidLoad 
{ 
    if (managedObjectContext == nil) { 
     managedObjectContext = [(CoreDataStuffAppDelegate *) [[UIApplication sharedApplication] delegate] managedObjectContext]; 
     NSLog(@"After managedObjectContext: %@", managedObjectContext); 
    } 

    // [self addRecord]; 
    [super viewDidLoad]; 

    if ([self fetchData]) { 
     NSLog(@"after self fetchData patientArray count is %i", [parentArray count]); 
     if ([parentArray count] == 1) { 
      Parent *parentInfo = (Parent *)[parentArray objectAtIndex:0]; 
      parentItem1.text = parentInfo.Mother; 
      NSLog(@"fetching on load %i", [parentArray count]); 

      //Try 1: just going after the relationship route (FAIL: cuz data wont store. stays null) 
     // childItem1.text = parentInfo.ParentToChild.Kid; 

       // Try 2: going the route of directly talking to the second entity 
      childItem1.text = child.Kid; 
     } 
    } 

// Save Record 
    - (void)saveRecord{ 
    if (managedObjectContext == nil) { 
     NSLog(@"there is no context, arrg"); 

    } 
    NSLog(@"array count is %i", [parentArray count]); 
    if ([parentArray count] == 1) { 
     NSManagedObjectContext *context = managedObjectContext;//[parent managedObjectContext]; 
     NSLog(@"context 1 is: %@", context); 

     Parent *parentInfo = (Parent *)[parentArray objectAtIndex:0]; 
     parentInfo.Mother = parentItem1.text; 
     NSLog(@"data says: %@", parentInfo.Mother); 
     NSLog(@"text syas: %@", parentItem1.text); 

     // Try 1, save it through the child relationship thing. (failed) 
    // parentInfo.ParentToChild.Kid = childItem1.text; 
    // NSLog(@"childSave says: D: %@ T: %@", parentInfo.ParentToChild.Kid , childItem1.text); 

     // Try 2. from Resipeas app 
     if (!child) { 
      self.child = [NSEntityDescription insertNewObjectForEntityForName:@"Child" inManagedObjectContext:context]; 
      [parent addChildObject:child]; 
      NSLog(@"I hit the child"); 

     } 
     child.Kid = childItem1.text; 
     NSLog(@"1: childSave says: D: %@ T: %@", parentInfo.ParentToChild.Kid , childItem1.text); 
     NSLog(@"2: childSave says: D: %@ T: %@", child.Kid , childItem1.text); 



     NSError *error = nil; 
     if (![context save:&error]) { 
      NSLog(@"context 2 is: %@", context); 
      NSLog(@"major fail %@", [error localizedDescription]); 
     // abort(); 
     } 
    } 
    NSLog(@"saving stuff"); 

} 

// FetchData 
- (BOOL)fetchData { 
    NSLog(@"doing the fetch"); 
    BOOL returnResult = FALSE; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

    if (managedObjectContext == nil) 
    { 
     NSLog(@"ok making a new managed object context"); 
     managedObjectContext = [(CoreDataStuffAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    } 

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Parent" inManagedObjectContext:managedObjectContext]; 
    [fetchRequest setEntity:entity]; 
    [fetchRequest setFetchBatchSize:1]; 
    NSError *error; 
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy]; 
    if (mutableFetchResults == nil) { 
     NSLog(@"Fetching Error"); 
    } else { 
     [self setParentArray:mutableFetchResults]; 
     returnResult = TRUE; 
     NSLog(@"Fetching went well"); 
    } 

    [mutableFetchResults release]; 
    [fetchRequest release]; 

    return (returnResult); 
} 

답변

2

자 : 여기

몇 가지 코드입니다. 대부분의 엔티티는 약 6 가지의 속성을 가지고 있으며, 내가 본 것 중 가장 많은 것이 20 주위에 있다고 생각합니다.

코어 데이터는 영속성이있는 객체 그래프 관리 시스템이 가장 중요합니다. Model-View-Controller (MVC) 디자인의 모델 계층을 구현하기위한 것입니다. 따라서 Core Data는 주로 데이터를 저장하지 않는 모델링에 관한 것입니다.

개체는 실제 개체, 조건 또는 이벤트를 나타 내기위한 것입니다. 100 가지의 속성을 가진 실세계는 많지 않습니다. 예 : 사람의 상세한 모델을 만들고 싶습니다. 당신은 성, 성, 주소 (각 주소 구성 요소의 속성 포함), 운전 면허증 번호 및 발행일, 주소가 적힌 직장, 사회 보장 번호 등을 원합니다. 모든 것을 하나의 주소로 집어 넣으려고 한 경우 Person 엔티티 당신은 수십 가지의 속성으로 끝날 수 있습니다. 그러나 모델링하는 데이터와 데이터 내의 관계를 면밀히 살펴보면 현실 세계에서 주소, 운전 면허증, 직장 등은 실제로 실제 사람들의 속성이 아니라 오히려 다른 실제 객체 관련에 실제 사람이 있습니다. 따라서 가장 좋은 방법은 해당 개체의 특성을 개별 엔터티로 분할하고 Person 엔터티에 대한 관계를 만드는 것입니다. 이는 모델을보다 현실감있게 만듭니다. 결국 한 명 이상의 사람이 같은 주소에서 살거나 같은 장소에서 일할 수 있습니다.

따라서 처음부터 다시 시작하고 데이터 모델 디자인을 다시 생각해 볼 필요가있을 것입니다.

엔티티와 managedObjects의 차이점을 알고 있어야합니다. 엔티티는 추상적이며 managedObject에 대한 키, 값 유형 및 관계를 정의하는 역할 만합니다. 엔티티는 클래스가 인스턴스가 될 때 managedObjects에 대한 것입니다.

당신은 다른 두 가지 문제가 발생 : 당신이 당신의 엔티티에 대한 사용자 정의 NSManagedObject 하위 클래스를 정의한 경우

(1)은 예컨대 parentInfo.ParentToChild.Kid을 도트 구문 접근 양식을 사용할 수 있습니다. 그렇지 않으면 일반 NSManagedObject 인스턴스를 사용하고 있으며 키 - 값 메서드를 사용해야합니다. [parent setvalue:forKey].

(2) 가져 오기는 하나의 엔티티의 개체 만 반환합니다. 따라서 부모 엔티티와 하위 엔티티가있는 경우 각 가져 오기는 부모 또는 자식 중 하나의 인스턴스를 반환하지만 두 인스턴스는 모두 가져 오지 않지만 두 인스턴스 모두 가져 오기 엔티티에서 상속하지 않는 한 반환합니다.

+0

첫 번째. 그와 같은 완전한 답을 줄 시간을 가져 주셔서 감사합니다. 나는 동의한다,이 경우의 "환자"에 관해 모든 것을 과식하는 것은 틀린 길이다. 그러나, 관련 물린 크기 청크로 정보 나누기 같은 여러 엔터티를 만들려고했는데, 나는 하나의 엔터티를 제외한 모든 데이터를 저장하는 데 문제가있었습니다.그러나, 귀하의 의견 (2) 나를 생각하고있다. 나는 "부모"에 대해서만 가져 왔고 다른 것에 대해서는 가져 가지 않을 것이라고 생각합니다. 그것은 저의 문제 중 하나입니다. –

+0

저는 한 번에 하나 이상의 엔티티에 데이터를 가져오고 저장하는 방법에 고심하고 싶습니다. 사실 내 모델을 다시 작업하게되어 기쁩니다. 도움에 다시 한번 감사드립니다. 여러 주체와 이야기하고 다시 쓰는 방법에 대한 아이디어는 언제든지 환영 할 것입니다. –

+0

나는 당신이 관계의 개념에 대해 감사한다고 생각하지 않는다. 관계를 통해 한 엔티티의 객체를 가져온 다음 관계를 사용하여 관련 엔티티의 객체에 액세스 할 수 있습니다. 예 : Patient 엔티티가 있고이 Patient와 관련된 Doctor 엔티티가 <<--> Doctor입니다. 각 환자 개체에는 의사가 하나 있지만 각 의사마다 많은 환자가있을 수 있습니다. 특정 환자의 의사를 찾으려면 해당 환자 개체를 가져온 다음 Patient.doctor 관계를 확인하여 의사에 대한 모든 정보를 찾습니다. 등등. – TechZen

관련 문제