2011-03-19 2 views
0

나는 잠시 동안이 문제를보고 있었지만 깨뜨릴 수는 없습니다. 그 CoreData에 내장 된 첫 번째 다 - 대 - 다 관계와 분명히 내가 누락 된 단순한 무언가가 있습니다 ...다 대다 CoreData 관계의 한쪽 끝을 삭제하는 루프를 저장하십시오.

나는 두 개의 다른 핵심 데이터 '엔터티'를 유지하는 화면을 가지고 있으며 엔티티는 다 - 대 - 다 관계. 첫 번째 엔티티와 첫 번째 엔티티와 두 번째 엔티티 간의 관계는 화면의 첫 번째 탭에서 유지 관리되며 이는 첫 번째 엔티티 인스턴스를 삭제하고 첫 번째 엔티티와 두 번째 엔티티 간의 관계를 추가/삭제할 수있게합니다.

내 문제는 내가 두 번째 항목을 유지 관리하는 두 번째 탭에 있습니다. 엔티티가 잘 표시되고 속성을 업데이트 할 수 있지만 삭제하려고하면 끝없는 저장 루프가 발생합니다.

두 번째 엔티티의 NSManagedObject 클래스의 willSave 메서드에 NSLog 항목을 추가하여 루프를 확인했다고 생각합니다.

엔티티는 NSArrays가 지원하는 NSTableViews에 표시됩니다 (바인딩을 사용하지 않았습니다). 나는 (아래 참조) 두 개의 탭과 삭제 작업은 간단 사이에 하나 managedObjectContext를 공유 해요 :

int currentRow = [[tableView selectedRowIndexes] firstIndex]; 
NSManagedObject *targetObject = [self.array objectAtIndex:currentRow]; 
NSError *error = nil; 
[managedObjectContext deleteObject:targetObject]; 
if (![managedObjectContext save:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

희망 누군가가 도움이 될 수 있습니다 ...

감사

스콧

+0

여기에 갈 많은 것이 없습니다. 무한 반복 루핑이나 '샘플'명령을 사용하여 추적을 얻으려면 오류가 발생했을 때 환경에 대한 정보를 더 게시 해보십시오. 최후의 수단으로 코드를 게시하십시오. – ImHuntingWabbits

답변

0

여기에 갈 필요는 없지만 삭제 규칙을 확인하십시오.

many-to-many 관계를 양쪽에 설정 한 경우 delete으로 설정하면 한 객체를 삭제하면 하나의 객체를 삭제하면 관련된 모든 객체가 삭제되므로 관련된 모든 객체가 삭제되므로 관련된 모든 객체가 삭제되므로 일련의 삭제가 설정 될 수 있습니다 개체 등등.

willSave 또는 willTurnIntoFault 또는 이와 유사한 방법을 사용자 정의한 경우 해당 코드에도 루프가 도입되었을 수 있습니다.

+0

답장을 보내 주셔서 대단히 감사합니다 ... 세부 사항이 부족하다는 것에 사과드립니다.하지만 앱에서 많이 볼 수는 없지만 코드는 꽤 표준 적입니다. –

+0

답장을 보내 주셔서 감사합니다 ...관계의 양측은 Delete Rule : Nullify로 설정되었습니다. 그냥 그때 나는 '엔티티 2'측면을 만들려고 했어 삭제 규칙 : 액션 없음하지만 도움이되지 않았습니다. willSave에 추가 된 유일한 코드는 NSLog였습니다.이 코드는 이제 루프를 제거한 것으로 입증되었습니다. 나는 너희들에게 좀 더 많은 정보를 제공하고 싶지만 그것을 얻는 방법을 모르겠다 ... @ImHuntingWabbits (귀하의 의견을 주셔서 감사합니다)에 의해 언급 된 샘플 명령을 시도했지만 정말 루프를 일으키는 볼 수 없습니다 ... 그 파일의 내용을 게시하는 가장 좋은 방법은 무엇입니까? –

+0

OK 그래서 어떤 일이 일어나고 있는지에 대한 좀 더 자세한 정보 ... SQLDebug 옵션을 사용하여 응용 프로그램을 실행했는데 삭제가 롤백되고 (로그 파일 날짜 및 시간이 제거됨) 다시 시도되고 있음을 보여줍니다. CoreData : sql : BEGIN EXCLUSIVE CoreData : sql : DELETE FROM ZSYMPTOM 여기서 Z_PK =? AND Z_OPT =? CoreData : sql : SELECT Z_PK, Z_OPT FROM ZSYMPTOM WHERE Z_PK IN (9) ORDER BY Z_PK CoreData : annotation : sql 실행 시간 : 0.0012s CoreData : sql : ROLLBACK –

1

OK, 간단 었죠 그래서 (내 잘못이 :

내가 사용했던 데이터는 별도의 데이터로드 스크립트를 사용하여 생성 된 sqlite3를 파일 (I '에로드되었다는 것을 언급해야

다양한 소스의 데이터 사용).

내가 추가 한 일부 레코드에는 Z_OPT에 대한 값이 포함되어 있지 않으며 CoreData는 이러한 레코드를 삭제할 때 오류가 발생했다가 다시 삭제하려고 시도했습니다.

일단 Z_OPT가 채워지면 모든 것이 효과가있었습니다. CoreData가 데이터베이스의 모든 변경 사항을 지금부터 관리하게 할 것입니다.

@TechZen과 @ImHuntingWabbits에게 감사드립니다.

+1

핵심 데이터 스키마가 문서화되지 않았으므로 매우 위험합니다. SQLite 저장소를 직접 생성 해보십시오. 올바르게 작성하는 것은 까다 롭습니다. 그렇더라도 Apple은 경고없이 스키마를 변경할 수 있습니다. – TechZen

관련 문제