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