6

코어 데이터에 유선 문제가 있습니다. 아이폰 OS 10 Swift3과 함께 내가 관리되는 개체 컨텍스트 나는 페칭 또는 내 응용 프로그램에서to-one 관계에 대해 받아 들일 수없는 유형의 값 : property = "user"; 원하는 유형 = 사용자; 주어진 유형 = 사용자;

func getContext() -> NSManagedObjectContext { 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    return appDelegate.persistentContainer.viewContext 
} 

에 데이터를 저장하고 각 시간을 얻을 나는 두 엔티티 '사용자'와 '레저'를 가지고있다. 원장을 사용자에게 지정하려고하지만 사용자가 여러 원장을 가질 수 있습니다. 따라서 사용자를 생성 할 수있는 UserTableView와 사용자를 생성하는 UserViewController 클래스가 있습니다. 장부에 대해서도 마찬가지입니다. 장부를 만들 때 나는 하나를 선택하고 장부에 할당해야하는 모든 사용자의 목록을 얻으며 그 반대의 경우도 마찬가지입니다. 나는이 같은 문제가 없었다 Data Model

이 어떤 도움을 매우 높이 평가한다 :

+1

당신이이 문제를 해결 했습니까? – Voltron

답변

0

:

상기와 같은 저장

, 나는 다음과 같이

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for to-one relationship: property = "user"; desired type = User; given type = User; 

내 데이터 모델이 보이는 오류가 발생합니다. 제 경우에는 단위 테스트를 실행하는 동안 일어났습니다. 이 경우 한 번에 두 개의 핵심 데이터 스택이 메모리에 있었고 하나는 응용 프로그램 하네스 용이고 다른 하나는 내 단위 테스트 용이었습니다.

이 문제를 해결하는 첫 번째 단서는 관계 속성을 설정하기 전에 어설 션을 설정하여 내가 설정 한 개체의 엔터티 유형이 관계의 예상 엔터티 유형과 동일한 지 확인해야했습니다. 그들은 동일해야하고, 나의 경우에는 그렇지 않았습니다.

필자의 경우 MatchRequest은 "개시 자"라는 Player과 일대일 관계가 있습니다. 그래서 내 주장은 다음과 같이 보았다 :

let player = try Player.findLocal(for: matchRequest.initiator, in: moc, createIfMissing: true) 
    let expectedEntity = self.entity.relationshipsByName["initiator"]!.destinationEntity! 
    assert(player!.entity === expectedEntity, "Player returned doesn't have the same entity type") 
    self.initiator = player 

위의 주장은 내가 인수 예외가 발생 코어 데이터에 의해 사용되는 주장과 유사 의심되는 실패했습니다.

Player.entity()를 검사 할 때 오류의 원인이 된 엔티티 인스턴스가 반환됩니다.

저는 핵심 데이터가 핵심 데이터 스택에서 잘못 공유되는 엔티티의 일부 정적 속성을 설정하고 있다는 것이 문제의 근본이라고 생각합니다. MyManagedObject.entity()를 호출하면 한 스택에서 호출 될 때 올바르게 작동하지만 다른 스택에서는 호출되지 않습니다.

그래서이 문제를 해결하기 위해 관계에 넣기 위해 Player 객체를 만들 때 새로운 생성자가 아닌 이전 NSEntityDescription.insertNewObject(...) API를 사용하여 엔티티를 가져옵니다. 이렇게하면 주어진 관리 객체 컨텍스트에 올바른 엔티티가 사용됩니다.

그래서, 다시 정리해 보면 :

// SOMETIMES FAILS if you have more than one core data stack: 
result = Player(context: managedObjectContext) 

// ALWAYS WORKS: 
result = NSEntityDescription.insertNewObject(forEntityName: "Player", into: managedObjectContext) as? Player