2013-11-26 4 views
5

MagicalRecord의 기본적인 구현에서 손을 잡으려고합니다. 다음과 같이 실행 해 봅니다.MagicalRecord가 데이터를 저장하지 않습니다.

항목을 저장 한 다음 해당 유형의 항목을 가져 오면 방금 저장 한 항목이 나타납니다. 그러나 항목을 저장하고 응용 프로그램을 닫은 다음 다시 시작한 다음 가져 오면 빈 상태가됩니다. 저장을위한

코드 : 페치에 대한

- (void)createTestTask{ 
    NSManagedObjectContext *localContext = [NSManagedObjectContext contextForCurrentThread]; 

    Task *task = [Task createInContext:localContext]; 
    task.tName = @"First Task"; 
    task.tDescription = @"First Task created with MagicalRecord. Huzzah!"; 


    NSError *error; 
    [localContext save:&error]; 
    if (error != Nil) { 
     NSLog(@"%@", error.description); 
    } 
} 

코드 : 내가 여기서 뭔가를 놓친 거지 확신하지만

- (void) fetchTasks{ 
    NSArray *tasks = [Task findAll]; 
    NSLog(@"Found %d tasks", [tasks count]); 
} 

(나는 아무것도 실제로 저장되는 경우 여기를 알고 싶은 모든) 내가 stackoverflow 또는 내가 본 자습서에서 찾을 수있는 것.

어떤 도움을 환영합니다.

답변

8

도움이 될 수도있는 것입니다 : 당신이 코어 데이터 스택이 +[MagicalRecord setupCoreDataStack] 방법 중 하나를 초기화나요?

스택이 제대로 초기화 되었습니까? 즉, 상점 및 모델이 호환 가능합니까? 그렇지 않은 경우 MagicalRecord (더 적절하게 Core Data)가 Persistent Store없이 전체 스택을 설정합니다. 상점이 없기 때문에 상점에 저장할 수 없을 때까지 모든 것이 잘되는 것처럼 보이기 때문에 이것은 성가신 일입니다. MagicalRecord에는 스택의 현재 상태를 검사하는 데 사용할 수있는 +[MagicalRecord currentStack] 메서드가 있습니다. 스택을 설정 한 후에 디버거에서 시도해보십시오.

그렇게했다고 가정 할 때, 확인해야 할 다른 것은 오류 로그입니다. 사용하는 경우

[localContext MR_saveToPersistentStoreAndWait]; 

모든 오류가 콘솔에 기록되어야합니다. 일반적으로 앱의 후속 실행시 데이터가 표시되지 않으면 저장을 호출했다고 생각했을 때 데이터가 저장되지 않았기 때문입니다. 그리고 데이터가 올바르게 검증되지 않아 저장이 이루어지지 않습니다. 일반적인 예는 필수 속성이 있고 save를 호출 할 때 여전히 nil입니다. "정상적인"핵심 데이터는 이러한 문제를 전혀 기록하지 않으므로 실제로는 저장 작업이 실패한 경우 제대로 작동했다고 생각할 수 있습니다. 반면 MagicalRecord는 모든 오류를 포착하고 최소한 데이터로 어떤 일이 벌어지고 있는지 알려주는 콘솔에 로그합니다.

+1

saveToPersistentStoreAndWait 트릭을했다. currentStack은 적어도 그것이 작동해야한다는 것을 보여주었습니다. 저장이 제대로 실행되지 않은 이유는 모르지만 saveToPersistentStoreAndWait는 그 이유를 알 수 없습니다. 그것에 대한 아이디어가 있습니까? – ophychius

3

마술 기록으로 시작했을 때도이 문제에 직면했을 때 문제는 데이터를 저장하는 데 사용하는 컨텍스트입니다. 여기 내 코드는 질문에 "그것을가 연결되어"나는 명백한 물어 봐야 당신에게

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { 

       NSArray *userInfoArray = [UserBasicInfo findByAttribute:@"userId" withValue:[NSNumber numberWithInt:loggedInUserId] inContext:localContext]; 

       UserBasicInfo* userInfo; 

       if ([userInfoArray count]) { 
        userInfo = [userInfoArray objectAtIndex:0]; 
       } else { 
        userInfo = [UserBasicInfo createInContext:localContext]; 
       } 

       userInfo.activeUser = [NSNumber numberWithBool:YES]; 
       userInfo.firstName = self.graphUser[@"first_name"]; 
       userInfo.lastName = self.graphUser[@"last_name"]; 
       userInfo.userId = @([jsonObject[@"UserId"] intValue]); 
       userInfo.networkUserId = @([jsonObject[@"NetworkUserId"] longLongValue]); 
       userInfo.userPoint = @([jsonObject[@"PointsEarned"] floatValue]); 
       userInfo.imageUrl = jsonObject[@"Picturelist"][0][@"PictureUrL"]; 
       userInfo.imageUrlArray = [NSKeyedArchiver archivedDataWithRootObject:jsonObject[@"Picturelist"]]; 
      } completion:^(BOOL success, NSError *error) { 

      }]; 
0

사용이 당신의 일

[[NSManagedObjectContext MR_defaultContext]saveToPersistentStoreAndWait]; 
+0

이 질문에 이미 답변되었습니다 ... 그리고 당신이 언급 한 것은 원래 대답의 일부였습니다 .... – ophychius

관련 문제