2013-03-03 7 views
0

CoreData 데이터베이스를 사용하는 TableViewController가 있습니다. TableviewController의 데이터베이스를 읽고 싶은 또 다른 UIviewController가 있습니다. 내가 한 일은 다음과 같습니다.TableViewController의 CoreData 데이터베이스에서 데이터를 가져 오는 중

//In UIviewController 
-(NSArray *)fetchRecordedDatainsqldatabase 
{ 
    // construct a fetch request 

    NSError *error; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"TrackerList" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 
    //[fetchRequest setFetchBatchSize:20]; 
    // Create the sort descriptors array. 
    NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"descript" ascending:YES]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:descriptor, nil]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 
    // return the result of executing the fetch request 
    return [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];} 

는 나는 그 라인에 도달 할 때 그래서 프로그램이 항상 충돌한다

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

But managedObjectContext is always nil, at the line 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"TrackerList" 
inManagedObjectContext:self.managedObjectContext]; 

의 속성이 있습니다. 무엇이 문제 일 수 있습니까?

+0

NSManagedObjectContext는 어디에 생성합니까? – ColinE

+0

ViewDidLoad에서 _managedObjectContext = [[NSManagedObjectContext alloc] init]; – Bryanyan

+0

_managedObjectContext = [[NSManagedObjectContext alloc] init]을 입력하면 문제가 발생합니다. ViewDidLoad에서 _managedObjectContext는 nil이 아닙니다. 그러나 프로그램이 줄에 도달하면 충돌이 발생합니다. NSEntityDescription * entity = [NSEntityDescription entityForName : @ "TrackerList" inManagedObjectContext : self.managedObjectContext]; – Bryanyan

답변

0

일반적으로 AppDelegate의 스텁 코드에서 제공되는 managedObjectContext을 사용할 수 있습니다. 사건을 먹으 렴 경우에 당신은 사용할 수 있습니다

AppDelegate *appD = [[UIApplication sharedApplication] delegate]; 

를 다음 대신 라인의 :

NSEntityDescription *entity = [NSEntityDescription entityForName:@"TrackerList" 
inManagedObjectContext:self.managedObjectContext]; 

사용 :

NSEntityDescription *entity = [NSEntityDescription entityForName:@"TrackerList" 
inManagedObjectContext:appD.managedObjectContext]; 

하고이에 return 문을 교체해야합니다 :

return [appD.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

w NSManagedObjectContext 개체가 있으면 persistentStoreCoordinator (관리 대상 개체 모델이 필요하며 영구 저장소 유형을 설정해야 함)을 설정해야합니다.

프로젝트를 만들 때 '코어 데이터 사용'을 선택한 경우 AppDelegate.m에서이 모든 작업을 수행하는 방법을 확인할 수 있습니다.

어쨌든 첫 번째보기 컨트롤러에서 managedObjectContext를 이미 사용하고 있습니다. 따라서 두 번째보기 컨트롤러에서 동일한 객체를 가져와야합니다. 당신의 방법을 작동하려면

, 당신은 당신이 제공 한 코드 블록의 상단에 한 줄을 추가해야합니다 :

self.managedObjectContext = [[[UIApplication sharedApplication] delegate] managedObjectContext]; 
+0

AppDelegate에서 제공하는 managedObjectContext를 사용하고 있기 때문에이 메소드가 작동하기 위해해야 ​​할 일을 보여주기 위해 답변을 업데이트했습니다. – Rakesh

+0

고마워, 너의 것이 최선의 방법이다.이 방법으로 나는 기존의 데이터베이스에 접근 할 수있다. 이제 나는 당신의 접근법을 사용하고 그것이 효과가있다. 그러나 MasterViewController 들어, 자체 NSManagedObjectContext 있고 AppDelegate NSManagedObjectContext.Anyway 덕분에 링크하는 방법을 찾을 수 없습니다. – Bryanyan

+0

좋아요. 이것이 해결책이라고 생각한다면 내 대답을 받아 들일 수 있습니다. :) – Rakesh

0
영구 저장소 코디네이터로 초기화 할 필요가

관리 개체 컨텍스트 관리 대상 개체 모델이 필요합니다. XCode는 AppDelegate에서 이러한 모든 구현을위한 보일러 플레이트 코드를 제공하는 데 사용됩니다.

대체 솔루션으로 당신은 당신이

[MagicalRecord setupCoreDataStackWithStoreNamed:@"Database.sqlite"];

에 의해 핵심 데이터를 설정할 수 있습니다 MagicalRecord

사용해 볼 수 있습니다 그리고 당신은

NSManagedObjectContext *context = [NSManagedObjectContext defaultContext]; 
[TrackerList findAllSortedBy:@"descript" ascending:YES inContext:context]; 
하여 컨텍스트에있는 모든 trackerlist 값을 가져올 수 있습니다

다음 링크는 더 잘 인도 할 것입니다 How to make programming in Core Data pleasant

+0

예, AppDelegate에서 CoreData와 관련된 모든 객체가 초기화됩니다. 하지만 MasterViewController에는 - @ property (강하고 비 구조) NSFetchedResultsController * fetchedResultsController; - @ 속성 (강력한, 비 원자) NSManagedObjectContext * managedObjectContext; 그리고 심지어는 managedObjectContext에 대한 init이 보이지 않습니다. MasterViewController에서 어떻게 구현되는지 혼동합니다. – Bryanyan

+0

@Blyanyan : MasterViewController에서 managedObjectContext를 어떻게 얻었습니까? 첫 번째보기 컨트롤러입니까, 두 번째 컨트롤러입니까? – Rakesh

+0

새 프로젝트에 대해 Master/Detail Application을 선택하면 managedObjectContext가 이미 XCode에 의해 첫 번째 뷰 컨트롤러에 생성됩니다. – Bryanyan

관련 문제