2016-07-10 2 views
2

기본적으로 나는 NSManagedObjectContext에서 삭제 한 후 컨텍스트를 저장 한 후 a의 일부 속성에 액세스하려고합니다. 문제는 컨텍스트를 저장 한 후 개체 데이터를 오류로 표시하고 분명히 복구 할 수 없다는 것입니다.관리 대상 개체 삭제 후 코어 데이터 오류

문제를 재현하기 위해 샘플 프로젝트를 만들었습니다. here을 다운로드 할 수 있습니다.

City *city = [self.cities objectAtIndex:indexPath.row]; 
[self.managedObjectContext deleteObject:city]; 
if (![self.managedObjectContext save:&error]) { 
    [self.managedObjectContext rollback]; 
    NSLog(@"Error: %@", error); 
}else{ 
    NSLog(@"%@", city); 
    // All properties of "city" are zeroed. 
    // Saved. Update data sources and animate changes... 
} 

가 생산 :, 다음 코드 설명하기 위해

<City: 0x7fe1cbd3cba0> (entity: City; id: 0xd000000000040004 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/City/p1> ; data: { 
    country = "0xd000000000080002 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/Country/p2>"; 
    name = Rosario; 
}) 

<City: 0x7fe1cbd3cba0> (entity: City; id: 0xd000000000040004 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/City/p1> ; data: <fault>) 

내가 그것을 삭제 한 후, 관리되는 개체에 액세스하고 싶은 이유, 데이터 소스 역할을하는 NSMutableArray를 업데이트하는 것입니다 테이블 뷰를 생성하고 네비게이션 컨트롤러 스택의 이전 컨트롤러에서 다른 데이터 소스를 업데이트합니다 (샘플 프로젝트에서는 구현되지 않음).

최대 포장, 내 질문은 없습니다 :

NSManagedObjectContext에서 NSManagedObject을 삭제하고 컨텍스트를 저장 한 후, 더 이상 관리되는 개체의 데이터가 액세스 할 수 있음을 보장 더있다? 해당 관리 객체에 대한 참조가 유지되는 경우에도?

조사한 내용을 토대로 핵심 데이터는 컨텍스트가 저장되면 메모리를 절약하기 위해 엔티티 데이터를 제거합니다. 이 가정이 맞습니까? 이 데이터 오류의 원인이 될 수있는 다른 요인이 있습니까?

감사합니다.

+1

컨텍스트를 저장 한 후 삭제 된 개체에 액세스 할 수 있다고 생각하는 이유가 무엇입니까? 데이터 소스에는'NSFetchedResultsController'를 사용하십시오. – Avi

+0

삭제 된 개체에 대한 참조는 사용하지 않아야합니다. – Andy

+0

@Avi 나는 관리 대상에 대한 참조를 유지했기 때문에. – Mateus

답변

1

NSManagedObject은 항상 동적으로 렌더링됩니다. 따라서 삭제 된 경우 코어 데이터가 데이터를 폴트합니다. 더 이상 존재하지 않습니다. 귀하의 진짜 질문은 어떻게 다양한 배열에서 개체를 제거하는 것입니다? 먼저 원하는 검색 기술을 사용하여 개체를 삭제하기 전에 개체를 제거해야합니다. 이것은 가장 쉽고 가장 강력한 경로입니다. 둘째, 개체 포인터 자체는 여전히 유효하며 -removeObject: 호출과 함께 사용할 수 있습니다. 나는 강조 할 수있게 해준다. 이것은 허약 한 해결책이다. 개체를 삭제하기 전에 개체를 제거하는 것이 좋습니다. 두 번째 질문에 대한 대답에서

,

이 데이터 오류있는 원인이 될 수있다 다른 요인이 있습니까?

아니요. 개체를 삭제하면 오류가 발생합니다. 데이터가 지금까지 이용 가능하다면 그것은 구현 특성이기 때문입니다. 스펙 대신 구현에, 특히 데이터베이스 기술을 사용하면 모든 종류의 라이프 사이클 문제가 발생합니다. 현명한 의사를 인용하면 "하지 마세요."

+0

감사! 개체를 삭제 한 후 개체를 제거하고 컨텍스트가 저장되었는지 확인하는 것이 왜 바람직하지 않은지 자세히 설명해 주시겠습니까? – Mateus

+0

예, 컨텍스트 저장이 거의 실패하지 않습니다. 기본적으로 매우 드문 디스크 중단으로 실패합니다. iOS는 공간이 부족한 경우 제대로 작동합니다. 그것은 사용자에게 일찍 경고합니다.개발자가 문제를 무시하면 앱을 출시 할 수 없었을 것입니다. 둘째, 삭제 된 객체를 좀비로 간주해야합니다. 다른 방법으로 좀비를 보냈다는 사실 만 알면됩니다. 그것은 살아있는 물건을 기대하고 있습니다. 따라서 피 호출자와 계약을 파기하고 있습니다. 피사체가 망가질 것으로 예상해야합니다. – adonoho

관련 문제