2011-02-07 2 views
0

작은 Iphone-App에 대한 데이터베이스를 미리 채우려면 persistentStoreCoordinator sqlite-file이 이미있는 경우 AppDelegate의 메서드. 그렇지 않으면 DB를 만든 후 테이블에 데이터를 추가합니다. 그러나 데이터를 RootViewController에 직접 표시하지 말고 RootViewController의 Option 키를 눌러 액세스 할 수있는 다른 TableView에 표시해야합니다.AppDelegate에 데이터를 삽입 할 때 TableView를 새로 고치는 방법은 무엇입니까?

데이터가 저장되지만 TableView에 표시되지 않는 것이 문제입니다. 그러나 앱을 종료하고 다시 시작하면 데이터가 저장됩니다.

내 appDelegate에서 RootViewController로 managedObjectContext를 전달하고 거기에서 TableViewController로 전달했습니다. 따라서 managedObjectContext는 모든 곳에서 동일합니다.

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
if (persistentStoreCoordinator_ != nil) { 
    return persistentStoreCoordinator_; 
} 

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"TestDBApp.sqlite"]; 

NSString *storePath = [storeURL relativePath]; 
BOOL noDb = false; 

NSFileManager *fileManager = [NSFileManager defaultManager]; 
if(![fileManager fileExistsAtPath:storePath]) { 
    noDb = true; 
} 

NSError *error = nil; 
persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
}  

if(noDb) { 
    noDb = false; 
    [self populateDB]; 
} 

return persistentStoreCoordinator_; 

}

- (void) populateDB { 
// Create the fetch request for the entity. 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
// Edit the entity name as appropriate. 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Kunde" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 
// Edit the sort key as appropriate. 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"oxid" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; 
NSError *error = nil; 
if (![aFetchedResultsController performFetch:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

[self insertNewKunde:aFetchedResultsController]; 

[self saveContext]; 

[aFetchedResultsController release]; 
[sortDescriptors release]; 
[sortDescriptor release]; 
[fetchRequest release]; 

}

- (void)insertNewKunde:(NSFetchedResultsController *)fetchedResultsController { 

// Create a new instance of the entity managed by the fetched results controller. 
NSManagedObjectContext *context = [fetchedResultsController managedObjectContext]; 
NSEntityDescription *entity = [[fetchedResultsController fetchRequest] entity]; 
NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; 

// If appropriate, configure the new managed object. 
[newManagedObject setValue:[[NSDate date] description] forKey:@"oxid"]; 
[newManagedObject setValue:@"Max" forKey:@"fname"]; 
[newManagedObject setValue:@"Mustermann" forKey:@"lname"]; 

// Save the context. 
NSError *error = nil; 
if (![context save:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

}

: 여기

내가 (한 샘플 행이 예에서)이 DB를 미리 채울 코드입니다

managedObjectC 타세는 같은 RootViewController에 AppDelegate에에서 전달됩니다

- (void)awakeFromNib { 

RootViewController *rootViewController = (RootViewController *)[navigationController topViewController]; 

rootViewController.managedObjectContext = self.managedObjectContext; 

}

다른 TableViewController에 :

- (void)awakeFromNib { 
kundenVC = [[KundenViewController alloc] initWithManagedObjectContext:self.managedObjectContext]; 

}

이 사람이 나를 도와 줄 힌트를 줄 수 있습니까?

또한 viewWillAppear-Method를 통해 tableView를 다시로드하려고 시도했습니다. 하지만 효과는 없습니다.

답변

0

것 같다하지만 내 직감은 당신이 때까지 에게 self.populateDB를 호출되지 않습니다이다 "insertNewKunde"을 좋아한다 실제로 RootViewController가 생성됩니다. 이것은 RootViewController가 생성되지 않았기 때문에 RootViewController가 그 데이터를 보지 못한다는 것을 의미한다. 내가 틀릴 수도 있지만 마지막 줄은 위임자의 awakeFromNib 메서드는 결국 populateDB을 통해 self.managedObjectContext -> persistentStoreCoordinator -> self.populateDB를 호출한다고 추측합니다.

이처럼 보이는 로 awakeFromNib의 맨 위에 선 권리를 추가하려고하십시오

(void)awakeFromNib { 
    NSManagedObjectContext *context = self.managedObjectContext; 

    RootViewController *rootViewController = (RootViewController *)[navigationController topViewController]; 

    rootViewController.managedObjectContext = context;} 

내가 self.managedObjectContext은 (는 getter를 호출하기 때문에 문제가 해결 희망이 방법을 - (NSManagedObjectContext) managedObjectContext;) 필드 대신. 내부에 (생성 된 코드를 사용하는 경우) ** persistentStoreCoordinator ** getter에 대한 호출이 있습니다. 결국 populateDB 메서드가 호출됩니다.

작동하지 않는 경우에는 populateDB에서 중단 점을 설정하십시오. 디버거가 멈 추면 populateDB이 실제로 호출 된 메서드 호출 스택에 표시되어야하며 이는 문제를 파악하는 데 도움이 될 수 있습니다.

-andy

+0

노력해 주셔서 감사합니다. 나는 무거운 직업 때문에 당신의 제안을 시도하지 않았습니다. 그러나 나는 당신의 대답을 알아 차렸고 당신에게 피드백을 줄 것입니다. 그래서 나는 인내심을 간청한다. 감사. – sribo

+0

글쎄, 당신의 제안을 시도했지만 효과가 없습니다. 그런 다음 디버그를했고 거기에서 힌트를 찾았습니다. 콜 포인터가 내 populateDB에 머무를 때 managedObjectContext가 여전히 nil 인 것으로 나타났습니다. 좌절로 인해 나는 새 프로젝트를 열었고 다음과 같은 작업을 수행했습니다. 1) persistentStoreCoordinator에서 sqlite-File이 있는지 확인했습니다. 내가 사실이 아니라면 bool-flag를 설정합니다. 2) managedObjectContext에서 플래그가 true이면 내 populateDB를 호출했습니다. 이제 데이터가 호출 된 뷰에 즉시 표시됩니다. 어쨌든, 앤디에게 문제를 해결해 주신 것에 대해 감사드립니다. 그리고 미안 4 지연. – sribo

0

글쎄, 중요한 부분은 질문에 대한 답변입니다. [self saveContext] 란 무엇이며 테이블보기에 레코드를 어떻게 표시하고 있습니까?

데이터가 저장 되었기 때문에 여기에 제시된 코드가 작동한다고 가정합니다. 유일한 추측은 을 NSManagedObjectContext에 재설정 한 다음 다시 가져 오는 것입니다.

은 BTW 나는 무슨 일이 일어나고 있는지 짐작하기가 매우 어려운 새로운 독일어 문법 ;-)

+0

** saveContext **는 CoreData Framework가있는 Xcode에서 새 프로젝트를 만들 때 생성되는 메서드입니다. 레코드는 표준 Xcode 템플릿과 같이 표시됩니다. 맞춤형 셀을 사용하지 않습니다. 표준 템플릿의 RootViewController와 같습니다. – sribo

+0

데이터가 추가 된 후 (** persistentStoreCoordinator ** - ** populateDB **가 완료된 후 메서드가 완료된 후) NSManagedObjectContext를 재설정하려고했습니다. 하지만 효과는 없습니다. 어디 NSManagedObjectContext 재설정해야합니까? – sribo

+0

아마 내 접근 방식이 완전히 잘못되었습니다. DB를 미리 채울 수있는 다른 방법이 있는지 알고 싶습니다. 문제는 데이터베이스에 데이터를 저장할 수 있지만 레코드를 가져온 테이블 뷰는 이러한 데이터를 인식 할 수 없다는 것입니다. 이 tableView는 appDelegate를 통해 직접 액세스 할 수없는 TableViewController에 있습니다. 어떤 제안이라도 환영합니다. – sribo