要为我的小型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。但没有效果。
答案 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