如何在AppDelegate中插入数据时刷新TableView?

时间:2011-02-07 15:38:12

标签: iphone objective-c core-data reload tableview

要为我的小型Iphone-App预填充数据库,如果sqlite文件已经存在,我会检查AppDelegate中的 persistentStoreCoordinator 方法。如果不是,我在创建数据库后将一些数据添加到表中。但是数据不应该直接显示在RootViewController中,而是显示在另一个TableView中,可以通过按RootViewController中的Option来访问它。

问题是数据已保存但未在TableView中显示。但是如果终止并重新启动应用程序,那么数据就在那里。

我已将adminObjectContext从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();
}

}

managedObjectContext从AppDelegate传递到RootViewController:

- (void)awakeFromNib {

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

rootViewController.managedObjectContext = self.managedObjectContext;

}

和另一个TableViewController:

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

}

任何人都可以帮助我或提示吗?

我还尝试通过viewWillAppear-Method重新加载tableView。但没有效果。

2 个答案:

答案 0 :(得分:0)

嗯,你遗漏了回答你问题的重要部分。什么是[self saveContext]以及如何在表格视图中显示记录。

因为您的数据已保存,我假设此处给出的代码有效。我唯一能做的就是在NSManagedObjectContext上使用 reset 然后重新获取。

BTW我喜欢“insertNewKunde”,这似乎是新的德语语法; - )

答案 1 :(得分:0)

很难猜出发生了什么,但我的预感是你没有调用 self.populateDB ,直到实际创建了RootViewController。这意味着RootViewController不会看到该数据,因为它未创建。 我可能错了,但我猜你委托的awakeFromNib 方法的最后一行最终通过self.managedObjectContext调用 populateDB - > 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