Как обновить TableView при вставке данных в AppDelegate? - PullRequest
0 голосов
/ 07 февраля 2011

Чтобы предварительно заполнить мою базу данных для небольшого приложения для Iphone, я проверяю метод persistentStoreCoordinator в AppDelegate, если файл sqlite уже существует или нет.Если нет, я добавляю некоторые данные в таблицу после создания БД.Но данные должны отображаться не напрямую в RootViewController, а в другом TableView, доступ к которому можно получить, нажав опцию в RootViewController.

Проблема в том, что данные сохраняются, но не отображаются в табличном представлении.Но если завершить и перезапустить приложение, данные будут там.

Я передал managedObjectContext из моего appDelegate в RootViewController и оттуда в 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();
}

}

УправляемыйОбъектКонтекст передается из AppDelegate в RootViewController как:

- (void)awakeFromNib {

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

rootViewController.managedObjectContext = self.managedObjectContext;

}

идругому TableViewController:

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

}

Кто-нибудь может мне помочь или дать подсказку?

Я также пытался перезагрузить tableView через метод viewWillAppear-Method.Но без эффекта.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2011

Очень трудно догадаться, что происходит, но я догадываюсь, что вы не вызываете self.populateDB , пока 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 будет вызывать метод получения (- (NSManagedObjectContext) managedObjectContext;) вместо поля. Внутри (если вы используете сгенерированный код) есть вызов метода получения ** persistentStoreCoordinator **, который в конечном итоге вызывает метод populateDB .

В случае, если это не работает, продолжайте и установите точку останова внутри вашей populateDB. Когда отладчик останавливается, вы должны увидеть в стеке вызовов методов, откуда вы на самом деле вызываете populateDB , и это может помочь выяснить вашу проблему.

-Andy

0 голосов
/ 07 февраля 2011

Ну, важная часть, которую вы пропустили, чтобы ответить на ваш вопрос.Что такое [self saveContext] и как вы отображаете записи в табличном представлении.

Поскольку ваши данные сохранены, я предполагаю, что приведенный здесь код работает.Единственное, что я могу сделать, это использовать reset в NSManagedObjectContext, а затем повторить.

Кстати, мне нравится "insertNewKunde", который, похоже, является новой немецкой грамматикой;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...