다음 인터페이스가있는 NSManagedObject가 있습니다.코어 데이터 코코아 오류 1570. 둘 이상의 엔티티 개체를 저장할 수 없습니다.
@class Organization, Person;
@interface Assistance : NSManagedObject
@property (nonatomic, retain) NSDate * date;
@property (nonatomic, retain) Organization *organization; // Not optional, 1 to 1
@property (nonatomic, retain) NSSet *persons; // 1 to many
@end
사람은 조직과 1-1 관계가 있습니다. 지원은 조직 및과 1 대 1의 관계를 가지며 사람과 1 대 관계가됩니다.
항목을 저장하려고 처음 시도했지만 완벽하게 작동했지만 두 번째 시간은 아닙니다.
사례 시나리오 : 2013-07-26 00:00:00 +0000, 해당 조직 및 인물이있는 엔티티를 추가합니다.
앱을 다시 시작합니다. 현재 날짜 (7/27)에 대한 검색을 수행하고 아무 것도 찾지 않습니다. 응용 프로그램에서 항목을 편집하기 시작하여 MagicalRecord의 편리한 메소드 인 [Assistance createEntity]를 사용하여 새 항목을 만듭니다. 나는 즉시 날짜 (7/27)와 조직을 설정했다. Person 오브젝트가 추가되거나 제거됩니다. 다른 날짜를 선택하면, 나는 내가 setCurrentDate 방법 나 자신을 구현 한이 들어, 현재 지원 대상 기업을 저장하려고 :
- (void)setCurrentDate:(NSDate *)currentDate
{
if (assistanceWasChanged) {
NSLog(@"> > > Has changed, need to save with Persons {%i}, org {%@}, date {%@}", [self.assistance.persons count], self.organization.name, self.currentDate);
// [[NSManagedObjectContext defaultContext] saveOnlySelfWithCompletion:^(BOOL success, NSError *error) { NSLog(@"> > > 01:Assistance saved?"); }];
[[NSManagedObjectContext defaultContext] saveOnlySelfAndWait];
}
assistanceWasChanged = NO;
_currentDate = currentDate;
[self setCurrentAssistance]; // Tries to find Assistance with new date
}
그러나이 시간,이 저장되지 않습니다. 나는 코코아 오류 1570 (하지 못되는 필요한 모든 필드) 얻을 : 시간에 어떤 시점에서
> > > Has changed, need to save with Persons {1}, org {MSF}, date {2013-07-27 00:00:00 +0000}
2013-07-27 20:23:41.017 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8d61e50) → Saving <NSManagedObjectContext (0x8d61e50): *** DEFAULT ***> on *** MAIN THREAD ***
2013-07-27 20:23:41.018 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8d61e50) → Save Parents? 0
2013-07-27 20:23:41.018 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8d61e50) → Save Synchronously? 1
2013-07-27 20:23:41.018 -[NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0x8d61e50) Context DEFAULT is about to save. Obtaining permanent IDs for new 1 inserted objects
2013-07-27 20:23:41.019 CoreData: sql: BEGIN EXCLUSIVE
2013-07-27 20:23:41.019 CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ?
CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ?
2013-07-27 20:23:41.020 CoreData: sql: COMMIT
2013-07-27 20:23:41.021 +[MagicalRecord(ErrorHandling) defaultErrorHandler:](0x6b3a0) Error: <Assistance: 0x9cb16c0> (entity: Assistance; id: 0x9e5ac00 <x-coredata://15A3-4C6D-4025-9131-3D51048/Assistance/p1> ; data: {
date = "2013-07-26 00:00:00 +0000";
organization = nil;
persons = "<relationship fault: 0x8d80500 'persons'>";
})
는 조직 전무하다. 또한 '2013-07-26'날짜의 개체는 가져 오거나 편집 할 수 없습니다. 내 로그 문장에 표시된대로 내가 추가하려고하는 새 개체의 날짜는 '2013-07-27'입니다. 처음에는 CoreData가 오래된 데이터에 대한 포인터를 가지고 있다고 생각했지만, 그렇지는 않습니다. 처음 삽입 된 날짜는 가져 오지 않았습니다. .
@property (strong, nonatomic) Assistance *assistance;
내가 뭔가를 놓친 거지 : 나는 응용 프로그램을 다시 시작하면 (첫 번째 개체 (7/26)이 아직 거기는 차이를 만드는 경우 의 지원 엔티티 객체 내 구현 파일의 속성이다 코어에 대해 데이터? 왜 새로운 엔티티 객체를 저장할 때 액세스되는 첫 삽입 된 개체인가? 그리고 왜 조직 전무입니까? 새 organisation
을 생성하지 않는 것처럼
조직을 설정 한 부분을 포함하여 새 개체를 만드는 코드를 표시 할 수 있습니까? – ophychius
일이 잘못 될 수있는 곳이 많이 있습니다. 여기에서 가장 중요한 문제는 컨텍스트에 대한 아이디어를 아직 이해하지 못하고 있다는 것입니다. 객체는 컨텍스트에 연결되어 있으므로 데이터를 유지하려면 컨텍스트를 저장해야합니다. 이렇게하면 나중에 검색 할 수 있습니다. 나는이 코드에서 "잘못된"것을 보지 않고 있지만, 문제를 정확하게 지적 할 수있는 전체 그림이없는 것처럼 느껴집니다. – casademora
@casademora 고맙다 사울! 컨텍스트에 대한 개념을 이해하고 있다고 믿고 싶지만 한 번 더 살펴 보겠습니다. 내 문제는 내 3 엔티티 중 2 개가 잘못된 관계의 다양성을 갖고 있다는 것이 었습니다. – Eric