2014-04-12 2 views
0

Core Data를 처음 접했고 사전에 사과하고 싶습니다. SQL 용어 만 사용하면 더 잘 설명 할 수 있습니다. 나는 그물을 찾았지만 그것에 대한 답을 깨끗하게 찾지 못했습니다. 핵심 데이터가 검색 시간에 두 개의 행을 '고유 한'외부 'id (삽입시 코어 데이터가 제공하는 ID가 아닌)와 동일한 엔티티에서'결합 '할 수 있습니까?CoreData - 동일한 엔티티의 "join"행

unique_id | description  | iso_code 
---------------------------------------- 
13  | some desc  | code A 
13  | some other stuff | code B 
13  | some foo   | code C 

---------------------------------------- 
16  | some fun desc | code A 
16  | some other stuff | code B 
16  | some foo bar  | code C 

그래서 모든 행 (13) 또는 다른, 나는에서 같은 ID의 같은 세트를 "가입"시간을 가져 예를 들어 종류 등 합류 할 것 같은 ID를 가지고 exaple를 들어 내가 필드가 하나 개의 테이블을 가지고 예를 들어 설명별로 결과 세트 - iso_code는 코드 C입니다. 그런 다음 테이블보기에 결과를 표시하십시오.

메모리에서 다중 배열 및 사전 조작을 추가로 수행하지 않고도 런타임에이를 수행 할 수 있습니다. 예를 들어 3 배 더 많은 결과를 얻은 다음 축소 필터링 된 컬렉션으로 결합하여 표시 할 수 있습니다. 또는 하나의 엔티티를 더 사용하지 않고 그것과 관계를 만듭니다.

답변

1

코어 데이터는 SQLite의 래퍼가 아닙니다. 핵심 데이터는 관계형 데이터베이스가 아닙니다. 최종 결과로서, Core Data는 조인을하지 않습니다.

코어 데이터는 영구 객체 그래프입니다. 객체 그래프를 검색 할 수 있습니다.

unique_id = 13이라는 술어로 NSFetchRequest을 실행하면 엔티티의 3 개의 별도 인스턴스를 가져 와서 거기에서 처리를 진행하십시오. 정렬에 필요한 정렬 설명자를 요청에 지정할 수 있습니다.

NSFetchedResultsController을 사용하여 특정 요청을 테이블에 연결하면 실제로 특정보기 항목 만 쓸 수 있습니다.

EDIT : Core Data는 다른 고급 기능과 마찬가지로 개체가 일반 오류 (기본적으로 테이블 이름 + 영구 저장소가 SQLite 인 경우 행 번호)에서 확장 될 수있는 고급 메모리 관리 시스템을 갖추고 있지만 여전히 오류가 있지만 (SQLite는 다중 쓰레드가 아니기 때문에 Core Data가 수행하므로 중간 결과 캐싱을 수행합니다) 또는 메모리에 완전히 존재합니다 (즉, 객체에 직접 연결된 모든 필드). 핵심 데이터는 필요에 따라 자동으로 저장소로 이동하여 상태 *로 전환합니다.

(*) 비록 SQLite가 c.1995 단일 스레드 특성으로 인해 현대 응용 프로그램의 약한 링크이지만, 성능을 조정할 때 자주 코어 데이터가 자동으로 오류가 아닌 전체 가져 오기를 수행하도록하고 싶지 않을 수 있습니다. 그렇지 않으면 주 스레드가 다른 사용자가 SQLite 잠금을 가짐으로써 '백그라운드'활동에 잠기 게 될 수 있기 때문입니다. 워크로드와 스레드 또는 대기열 배열 방법에 따라 다릅니다.

0

코어 데이터가 [자동] 제공하므로 모델에 고유 한 ID가 필요하지 않습니다. 그런 다음 개체 파일을 생성 모델에서 함께 개체를 연결하면 헤더 파일이 뭔가를 찾을 수 있습니다 :

위의 예에서
@interface User (CoreDataGeneratedAccessors) 

- (void)addGoalObject:(Goal *)value; 
- (void)removeGoalObject:(Goal *)value; 
- (void)addGoal:(NSSet *)values; 
- (void)removeGoal:(NSSet *)values; 

@end 

은, "사용자"개체와 "목표"가 실재. 이 모델은 이러한 테이블을 관련 시키지만 프로그래머가 SQL에서와 같이이 테이블을 조인 할 키 필드를 제공하는 것은 제 문제는 아닙니다. 실제로 Core Data의 기능은 모델을 데이터베이스에서 추상화하는 것이며 코드는 데이터가 저장되는 형식에 거의 관심이 없습니다. 그래서 Core Data는 당신이 "join"이라고 부르는 것을 어떻게 처리할지 결정할 것입니다.

주어진 사용자에 대한 목표에 액세스해야하는 경우 위에 나온 메소드 호출을 통해 특정 사용자에게 링크 된 다양한 엔터티에 접근 할 수있는 접근 방법을 통해이를 수행 할 수 있습니다.

이것은 어려운 전환 이었지만, SQL을 사용 해본 적이 없다면 더 나아질 수 있습니다. 그것은 단지 당신을 위해 그 모든 것들을 않습니다. 그리고 고유 한 ID를 제공하는 것과 같은 SQL 개념을 사용하려고하면 궁극적으로 많은 문제를 일으키고 아무 것도 해결하지 못한다는 것을 알게 될 것입니다.

관련 문제