2014-01-17 3 views
0

SongsPlaylists 엔티티 사이의 관계를 만들었습니다. 현재 Playlist에있는 Songs에 액세스하려고합니다. 선택한 재생 목록이 나는 이것이 내가 모든 노래 객체에 접근하고있어 방법을 인출하고 NSMutableArray라는 재생 목록에 저장이 객체코어 데이터의 관련 객체에 액세스

optionsSingle.selectedRowNumber 

에 저장됩니다. 제공 재생 목록 개체 (optionsSingle.selectedRowNumber)와 관련된 노래 만 가져 오는 방법은 무엇입니까?

- (void)fetchDevices { 

    NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Playlists"]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Playlists" inManagedObjectContext:managedObjectContext]; 
    [fetchRequest setEntity:entity];  

    playlists = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 
} 

코어 데이터 모델 :

enter image description here

+1

'송 (Song)'과 '재생 목록 (Playlist)'모델을 게시 할 수 있습니까? 엔티티 관계가 제대로 설정되지 않은 것 같습니다. 재생 목록에는 충분한 노래 목록이 있어야합니다. –

+0

모델에 대해 뭔가 말해보세요. 엔티티에는 단 하나의 이름이 있어야합니다 (예 : '노래'와'플레이리스트' –

+0

'selectedPlaylist.songs'는 당신이 찾고있는 노래를 제공해야합니다 ...'songs'이 관계 이름 인 경우 –

답변

1

은 당신의 코드와 모델에 몇 가지 문제가 있습니다. 엔티티 클래스는 단 수로 지정해야합니다 (SongPlaylist).

방법은 fetchDevices은 (사본 & 붙여 넣기 오류 것 같아 오히려 fetchPlaylists 또는 뭔가를해야 하는가?)라고

당신은 그들을 검색을 너무 많이하고 있습니다.

- (void)fetchPlaylists { 

    NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Playlist"];  

    playlists = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 
} 

또한 관계를 줄이기 위해 시도 할 수 있도록 한 Playlist가 가지고있는 많은 Song (들) : 방법에 감소 될 수있다. 그것은 귀하의 요구 사항에 충분해야합니다. 그런 다음 계속 진행하여 재생 목록과 함께 자동으로 가져올 노래 목록에 액세스 할 수 있습니다.

+0

좋은 답변이지만 다 대다 관계에는 조인 테이블이 필요하지 않습니다. 조인 테이블에 추가 속성이 있어야하는 경우에만 양쪽 정렬 만 가능합니다. 그렇지 않으면 * "* 오류가 발생하지 않습니다". – Mundi

+0

감사합니다.나는 레일스에서 ​​많이 사용되는 것을 많이 사용하고 있는데,이 레일은 강력하게 추천된다. –

2

더 나은 디자인을 선택했다고 생각합니다. Sebastian에서 제안한 수정 사항은 매우 중요하지만 테이블 뷰를 다시 설계해야합니다. (나는 당신의 질문에 당신의 플레이리스트를 보여주는 테이블 뷰라고 추론한다.)

배열을 만들고 배열의 내용으로 테이블을 채우는 대신 NSFetchedResultsController을 사용해야합니다. FRC는 테이블 뷰와 관련된 모든 페칭 및 메모리 관리를 처리합니다.

마스터 세부 템플릿 (Xcode의 "새 프로젝트")을 열고 "핵심 데이터"옵션을 선택하면 NSFetchedResultsController의 작동 예제를 쉽게 얻을 수 있습니다.

지금 당신은 매우 쉽게 재생 목록에 가져올 수 있습니다

Playlist *playlist = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

당신이 깨끗하고 간결하고 읽을 수있는 코드를 작성하기가 훨씬 더 쉬워 질 것입니다 찾을 수 있습니다.